【问题标题】:PHP Gearman - idle when no workers availablePHP Gearman - 没有可用工人时空闲
【发布时间】:2013-02-23 19:36:16
【问题描述】:

是否可以在所有工作人员都在工作时让客户端空闲?

我有以下情况:

$client= new GearmanClient();
$client->addServer();

$data = array(thousands of entries);

foreach($data as $dt) {
    $client->doBackground('doFancy', $dt);
}

当我运行它时,它会产生数千个队列,甚至会导致内存过载。

在 foreach 循环继续分配新作业之前,是否可以等待工作人员空闲?

【问题讨论】:

  • 这似乎违背了使用队列的全部意义。您发送的每个任务有多大?您能否将它们打包成更大的块以减少您请求的任务量?
  • @Louis-PhilippeHuberdeau 每个任务将运行大约。 10 秒,但是像现在这样,我会推送 300000 个任务。
  • 如果处理信息的php脚本可以处理信息的大小,我很难相信Gearman守护进程不会处理它。它比 php 脚本更健壮..

标签: php gearman


【解决方案1】:

您可以为队列大小创建计数器并为完成事件设置回调。在此回调中,您必须递减计数器并检查计数器,如果它的值小于 N - 将添加新的一组任务并且计数器递增。

【讨论】:

  • 如果我做对了,后台工作人员必须向客户端发回回调。这可能吗?你可以写一个小例子(只是伪代码左右)?我将不胜感激。
  • 工作代码:$worker->addFunction('myfunc', 'handler'); 在处理函数中:function handler(GearmanJob $job) { $job->sendComplete('Any complete message'); } 在客户端中:function completeHandler(GearmanTask $task) { ... } $client->setCompleteCallback('completeHandler');
  • 我不确定这是否适用于后台作业。客户端创建后台作业并且不会等到作业完成。因此,当工作人员执行“sendComplete”时,客户端将已经完成执行。
  • 对,但是您可以创建将永久运行的客户端。像工人一样。在我的一个项目中,我使用这种方式,效果很好。
  • 另外,对于流程控制,我使用的是 Supervisord
猜你喜欢
  • 2012-05-12
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多