Gearman::Clientはまだtimeoutをサポートしてなかった
#TODO: timeout isn't supported by this client API yet.と一番上に書いてあった…。サポートしてないのかよ。PODに書いてくれ!
で、tokuhiromさんのBackPaperのGearman::Client::Asyncの例を元に、文末のようなコードでやってみた。
そしたらtimeoutは効いてくれるみたい。ちゃんと起動して5秒後にはon_failがコールされた。
お、これでいけるかな?と思ったら、on_failしたあとすぐに処理が戻ってこないで10秒経って(worker.plのsleepの時間だけ待って)から「done」が表示された。
timeoutしたあとに、すぐ処理が戻る(下記のコードで言うと「done」が表示される)ようにしたいんだけどどうしたらいいんだろうか。
client.pl
#!/usr/local/bin/perl
use strict;
use Gearman::Client::Async;
use Danga::Socket;
my $client = Gearman::Client::Async->new( job_servers => [ qw(127.0.0.1) ] );
my $result;
my $task;
Danga::Socket->AddTimer(
0 => sub {
$task = Gearman::Task->new("sleepcheck", undef, {
timeout => 5,
on_fail => sub { print "failed\n" },
});
$client->add_task($task);
},
);
Danga::Socket->SetPostLoopCallback( sub { !$task->is_finished } );
Danga::Socket->EventLoop;
print "done.\n";
worker.pl
#!/usr/local/bin/perl
use strict;
use Gearman::Worker;
use Carp ();
my $worker = Gearman::Worker->new;
$worker->job_servers(qw(127.0.0.1));
$worker->register_function(
sleepcheck => sub {
sleep 10;
return "done sleep check";
},
);
$worker->work while 1;