Gearman を使って時間がかかる処理をキューにして worker にやらせてみた
Web から時間のかかる処理をキューとしてやらせたくて、TheSchwartz を使おうかと思っているが、 とりあえず Gearman で挙動を確かめてみた。 といっても、ほとんど ZIGOROu さんのコードを参考にさせてもらいました →log4ZIGOROu : Gearmanを使ってみた 目的は時間のかかる処理を Gearman がキューとして受け付けて、順番に処理していく様子を眺めたかったので、
- worker は なんか文字列を受け取って、10秒待ってから、log.txt というファイルに受け取った文字列と共に今の時刻を追加で書き込む
- client は 実行されると dispatch_background メソッドを使って結果を受け取るのを待たずにタスクをディスパッチする。この場合にタスクへの引数は実行された時刻
というサンプルにしてみた。まずは worker 。
!/usr/bin/perl
use strict;
use warnings;
use Gearman::Worker;
use Storable;
use IO::File;
my $worker = Gearman::Worker->new;
$worker->job_servers(qw|localhost|);
$worker->register_function(
sum => sub {
my $job = shift;
sleep(10);
&work( $job->arg );
}
);
$worker->work while 1;
sub work {
my $client_time = shift;
my $text = "client:$client_time worker:" . time();
my $io = IO::File->new();
$io->open( 'log.txt', 'a' ) or die $!;
$io->print("$text\n");
$io->close;
}
次に client のソース。
#!/usr/bin/perl
use strict;
use warnings;
use Gearman::Client;
use Gearman::Task;
my $client = Gearman::Client->new;
$client->job_servers(qw|localhost|);
$client->dispatch_background( "sum", time(), {} );
gearmand を立ち上げて、worker も実行。 そんでおもむろに client を適当に連射。 するとちゃんとキューとして受け付けて10秒待ってから書き込んでくれてる様子。
client:1204818581 worker:1204818591 client:1204818599 worker:1204818609 #連射スタート client:1204818600 worker:1204818619 client:1204818601 worker:1204818629 client:1204818601 worker:1204818639 client:1204818602 worker:1204818649 client:1204818602 worker:1204818659 client:1204818603 worker:1204818669 client:1204818668 worker:1204818679 #連射終わる client:1204818715 worker:1204818725
次は TheSchwartz を使ってみる。
