【问题标题】:Gearman with PHP - threads in worker使用 PHP 的 Gearman - worker 中的线程
【发布时间】:2011-06-29 12:08:30
【问题描述】:

我对 Gearman 和 PHP 工作者有疑问。 我想同时运行相同的功能。但现在 Gearman 似乎把它排成了队列。

我正在搜索的输出是:

$ ./daemon.php  
Starting daemon...
Received job: H:www-dev1:15 
Received job: H:www-dev1:16 
Finished
Finished

但是当前代码的输出是:

$ ./daemon.php  
Starting daemon...
Received job: H:www-dev1:15 
Finished
Received job: H:www-dev1:16 
Finished

是否可以使用 pcntl_fork() fork GearmanWorker?

客户:

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

$args = array('test' => 'test1');
$args = serialize($args);

$client->doBackground('test', $args);
sleep(1);
$client->doBackground('test', $args);

echo "Done";

工人:

#!/usr/bin/php
<?php

echo "Starting daemon..." . PHP_EOL;

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('test', 'testFunc');

while ($worker->work()) {
}

function testFunc($job) {

    echo "Received job: " . $job->handle() . PHP_EOL;
    sleep(10);
    echo "Finished" . PHP_EOL;  
}

【问题讨论】:

    标签: php multithreading fork gearman


    【解决方案1】:

    一名工人一次可以处理一项工作。如果您需要执行多个作业,则当然需要创建多个工人。在您的情况下,只需多次执行“Worker”脚本并将它们放在后台。或者(正如你自己提到的)创建分叉,但第一个肯定更容易;)

    【讨论】:

    • 很好的答案,它是正确的,并且触及了一些记录较少的需要知道的东西..
    • 我使用 Supervisor(在 Ubuntu 中)来确保我的 Gearman 工作人员的多个实例始终在运行。
    • @Gabe Spradlin,如果我错了,请纠正我,但这里的对话是关于 php,而不是 nodejs 的主管模块
    • @Velaro 我指的是 Linux 上的 Supervisor 程序,它允许您管理您想要作为守护程序运行的任何程序。你可以定义你想运行多少个实例,程序在被认为失败之前应该重启多少次,等等。见supervisord.org
    • @Gabe Spradlin,哦,谢谢你的好回应!
    【解决方案2】:

    您可以尝试使用工人克隆功能来创建更多工人

    GearmanWorker::clone(void)
    

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2023-03-31
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多