Gearman任务 - 如何检测所有已完成的任务?

时间:2013-10-10 13:32:22

标签: php gearman

代码:

$gmc = new GearmanClient();
$gmc->addServer();
$gmc->setCompleteCallback(function(GearmanTask $task){
    echo 'Complete: Task ' . $task->unique() . PHP_EOL;
});

for ($i=0; $i<10; $i++) {
    $gmc->addTask('queryShard', json_encode($taskData), null, 'Job:' . $i);
}

if (!$gmc->runTasks()) {
    echo "ERROR " . $gmc->error() . "\n";
}

我可以看到每个已解雇的任务何时完成。但是,有没有办法在所有已启动的任务成功时触发事件(请不要提供依赖于手动任务注册的解决方案)?

此外,任何人都可以建议如何将一组任务作为一组来管理吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

runTasks 将阻止调用线程的执行,直到完成所有添加的前台任务。有关详细信息,请参阅fiskfisk answer。但是,完成所有任务并不意味着所有任务都已成功完成。

Gearman应用程序框架故意不对任务的(非)成功竞争做出假设。有许多Gearman客户端实现和无限数量的用例。开发人员可以为相关用例提供最合适的解决方案。

最常见的是,我会使用SplObjectStorage类以及实现创建,失败,警告,异常和完整回调来跟踪客户端的任务完成情况。当可能需要在工作人员方面进行额外跟踪时,可能会出现复杂的用例。

答案 1 :(得分:0)

您可以使用以下内容:

$taskset = $gmc->new_task_set();
while(...) {
    $taskset->addTask(...);
}
$taskset->wait();

等待所有工作完成。