前のエントリの続き。
今回も、いろいろテスト。
workerを複数にしたいよ。
当然ですね。 前回なんでテストしなかったんだろう。
結論から言うと、
php worker.php
を2つ立てとけば勝手にそのworkerたちが動いてくれます。
テストのスクリプトは↓
10個タスクをぶち込むクライアント
client.php
<?php
$client = new GearmanClient();
$client->addServer();
for ($i = 1; $i <= 10; $i++) {
print "add $i\n";
$client->doBackground("test", $i);
}
1タスク5秒かかる。
worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('test', 'my_test');
while ($worker->work());
function my_test($job) {
print "[begin]".$job->workload()."\n";
sleep(5);
print "[ end ]".$job->workload()."\n";
}
client.phpを実行すると...
$ php client.php
add 1
add 2
add 3
add 4
add 5
add 6
add 7
add 8
add 9
add 10
worker.phpを1個しか立ち上げてなければ、
$ php worker.php
[begin]1
[ end ]1
[begin]2
[ end ]2
[begin]3
[ end ]3
[begin]4
[ end ]4
[begin]5
[ end ]5
[begin]6
[ end ]6
[begin]7
[ end ]7
[begin]8
[ end ]8
[begin]9
[ end ]9
[begin]10
[ end ]10
となります。
worker.phpを2個立ち上げておけば
ぞれぞれ
$ php worker.php
[begin]1
[ end ]1
[begin]3
[ end ]3
[begin]5
[ end ]5
[begin]7
[ end ]7
[begin]9
[ end ]9
$ php worker.php
[begin]2
[ end ]2
[begin]4
[ end ]4
[begin]6
[ end ]6
[begin]8
[ end ]8
[begin]10
[ end ]10
となります。
なので、同時実行させたい分workerを事前に起動させておけばOKです。
本当は、タスクの増減でworkerプロセスも勝手に増減してほしいですが、
gearmanでは無理っぽいので、ここはmaxプロセス立ち上げておくしかなさそうです。
もしくは、キューの溜まり具合を監視してうまいことやるか。
workerが処理中に死んだらどうなるの?
もちろん大丈夫です。当然ですが。
$ php worker.php
[begin]1
[ end ]1
[begin]2
[ end ]2
[begin]3 <- ここでCtrl+D
3番のジョブを実行中に死にました。
再度、workerを起動します。
$ php worker.php
[begin]4
[ end ]4
[begin]5
[ end ]5
[begin]6
[ end ]6
[begin]7
[ end ]7
[begin]8
[ end ]8
[begin]9
[ end ]9
[begin]10
[ end ]10
[begin]3
[ end ]3
失敗したジョブは自動で再度キューにぶち込まれるようです。
