2

我想并行化已经由 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()

谢谢你的帮助

4

2 回答 2

4

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

使用addTask()对独立任务(但可能是相关的)进行分组可以很容易地完成一组任务,然后再进行假设所有先前任务都已完成的操作。例如,以 4 种不同的分辨率调整图像大小,然后在完成所有四个任务后将图像设置为活动。这很容易通过runTasks()四个addTask()调用来实现,一个runTasks()然后更改图像的状态,而使用 doBackground 您必须轮询您已提交给 gearmand 的任务的状态以了解它们何时完成。

于 2012-05-02T13:18:35.403 回答
2

一个很好的观点是:

如果您的 Worker 已死或无法访问,则 doBackground 会更好,因为 gearman 无论如何都会收到工作量,而不是等到 Worker 存在并为您和大多数情况下(至少以我的经验)执行此操作,您使用 gearman 以这种方式工作, 发送任务、工作负载并等待它们异步完成。

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

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

于 2013-09-25T19:18:47.403 回答