我想并行处理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()
感谢您的帮助
答案 0 :(得分:4)
不同之处在于runTasks()
将阻止,直到通过addTask()
添加的所有任务完成为止。完成所有三个任务后,最后一个示例将完成(添加sleep()
调用以在实践中查看它),而第一个示例将把任务踢到gearmand然后继续运行脚本。
使用addTask()
对独立任务进行分组(但可能相关)可以在执行假定所有先前任务已完成的操作之前轻松执行一组任务。一个示例可以是以4种不同分辨率调整图像大小,然后在完成所有四个任务后将图像设置为活动。使用runTasks()
,这可以通过四次addTask()
次调用轻松实现,一次runTasks()
,然后更改图片的状态,而使用doBackground,您将需要轮询任务状态我们已经提交了装备,知道他们何时完成。
答案 1 :(得分:2)
这里有一个好处是:
如果你的工人已经死亡或无法到达,那么doBackground将会更好,因为无论如何齿轮工将接收工作量而不是等待UNTIL工人存在并且为你和大多数情况(至少在我的经验中)这样做你使用gearman来以这种方式工作,发送任务,工作量并等待他们完成异步。
因此,如果您的系统必须具有容错能力,那么您应该使用doBackground而不是addTask ....否则,如果您需要对我们的任务进行STRONG控制,那么addTask会更好。
希望这也可以为其他人解决......