- 2011/1/22 土曜日 21:19:36
- perl
最近Gearmanに入門しているのですが、いろいろとはまったのでメモ。
$worker->workは”Do one job”ではなくDo job loop
$worker->work while 1;
みたいなサンプルが書いてあったり
Gearman::Job->work(%opts) Do one job and returns (no value returned). You can pass "on_start" "on_complete" and "on_fail" callbacks in %opts.
って書いてあるのですが(しかもこれは、Gearman::JobではなくてGearman::Workerだし、、、)
workはオプション無しで呼ばれた場合はwhile 1なんかなくてもloopします。
work_once的な動きにしたいのであれば
$worker->work(stop_if => sub { 1 });
とすればいいです。stop_ifをmax_requests_per_child的な動きにしたい場合はkazeburoさんのgearman-starter.plを参考にするといいです。
ちなみにこれは作者にメールでパッチも送ったりもしたのですがこのRTが同じ内容。1年半ぐらい放置みたいなので直る気配なし。
Gearman::Client->job_serversはArrayRefを受け取れるけど、Gearman::Worker->job_serversは受け取れない
結構はまりました。
my $clinet = Gearman::Clinet->new; $client->job_servers(['127.0.0.1']);
はokだけど
my $worker = Gearman::Worker->new; $worker->job_servers(['127.0.0.1']);
は駄目。正しくは
my $worker = Gearman::Worker->new; $worker->job_servers('127.0.0.1');
としなければならない。これもRTにあがってますね。
Gearman::Workerはfork safeじゃないんでfork後生成
まぁDBIのdbhとかと一緒ですね。いくつかのネット上の例でParallel::Preforkなんかと組み合わせて使う時に
親プロセスで$worker作って共有している例注1があったのですが、ちゃんとやるなら子供で生成すること。
一見普通に動いちゃうのですが通信がまざって変になるかもしれないです。
まとめ
あたらしくCPANモジュールを使い出す時にはPODと共にRTも一緒に見ておくとよい。
注1
ここの11pとかここ(もう直ってる)とか。ちなみにkazuhoさんの書いたものだと去年のadvent calendarのWriting a prefork server / daemon using Parallel::Preforkは子供でworker生成してます。この記事は、graceful shutdownやSIGHUPによるconfig reloadへの示唆が含まれているので必見ですです
コメント:0
トラックバック:0
- この記事のトラックバック URL
- https://blog.everqueue.com/chiba/2011/01/22/493/trackback/
- トラックバックの送信元リスト
- Gearmanのはまりどころ - へぼい日記 より