https://github.com/mash/NinNin というのをつくった。
よくGearman::Workerを使うんだけれど
gearman-starter.plのようなもので
gearmanのworker poolをつくっていて
裏(gearman worker)で動かしたいコードと、
httpリクエストを同期的に処理してるコードの場所が離れるから行ったり来たりしたりするのが嫌だったりする。
もっとカジュアルに裏にまわしたい!
ということで、subroutine referenceを渡すと裏に回してくれるのが NinNin (ニンニン)。
予めgearman worker poolを用意しておけば
NinNin->setup({
  backend => NinNin::Backend::Gearman->new({
    job_servers => [ '127.0.0.1:4730' ]
  })
});
って感じでbackendを指定しておき、
ちょっと時間かかるかもしれないから裏に回したいってコードがあったら
ninnin(
  sub {
    my (@args) = @_;
    # run in gearman worker
    # ...heavy work...
  },
  (@args) # argument for sub
);
のようにして裏に回す。
my $coderef = ninnin( sub { ... } );
$coderef->( @args );
インターフェースは↑の方がいいかも、とtypesterは言った。
実装は
B::Deparse でsubroutine referenceからソースコードに戻して、
ソースコードと引数をまとめてjobにして、
evalしてsubrefを取り出して引数を渡して実行するものを register_function しておく、という感じ。
evalするところでimportしてるのが見えなくなったり、行番号がおかしかったり、その辺大変そうだけど、いいんじゃない?