与Gearman并行化

时间:2012-05-01 12:56:08

标签: php parallel-processing gearman

我想并行处理Gearman和PHP已处理的处理作业。 我不理解多次调用doBackground()之间的区别:

$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");

我有足够的工人注册,运行自己的PID。因此,3个工作岗位由3名不同的工人并行运行。

或者使用addTask(),如文档中所述,明确用于并行化。

$gmc->addTask("reverse", "Hello World!", null, "1");
$gmc->addTask("reverse", "!dlroW olleH", null, "2");
$gmc->addTask("reverse", "!dlroW olleH", null, "3");

$gmc->runTasks()

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

不同之处在于runTasks()将阻止,直到通过addTask()添加的所有任务完成为止。完成所有三个任务后,最后一个示例将完成(添加sleep()调用以在实践中查看它),而第一个示例将把任务踢到gearmand然后继续运行脚本。

使用addTask()对独立任务进行分组(但可能相关)可以在执行假定所有先前任务已完成的操作之前轻松执行一组任务。一个示例可以是以4种不同分辨率调整图像大小,然后在完成所有四个任务后将图像设置为活动。使用runTasks(),这可以通过四次addTask()次调用轻松实现,一次runTasks(),然后更改图片的状态,而使用doBackground,您将需要轮询任务状态我们已经提交了装备,知道他们何时完成。

答案 1 :(得分:2)

这里有一个好处是:

如果你的工人已经死亡或无法到达,那么doBackground将会更好,因为无论如何齿轮工将接收工作量而不是等待UNTIL工人存在并且为你和大多数情况(至少在我的经验中)这样做你使用gearman来以这种方式工作,发送任务,工作量并等待他们完成异步。

因此,如果您的系统必须具有容错能力,那么您应该使用doBackground而不是addTask ....否则,如果您需要对我们的任务进行STRONG控制,那么addTask会更好。

希望这也可以为其他人解决......