多个齿轮工工人获得相同的工作

  • 本文关键字:工作 gearman
  • 更新时间 :
  • 英文 :


我有两个工人同时运行,目前他们都在同一时间收到相同的工作。 我的印象是,当工作人员 A 正在运行作业时,工作人员 B 将收到队列中的下一个作业。 每个作业大约需要 10 秒才能完成。 我该如何实现此目的?

我已经将我的代码简化为这样:(假设客户端被调用两次,间隔两秒(

客户

$client = new GearmanClient();
$client->addServer();
$client->doBackground("my_task");

工人

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("my_task", "my_task_fn");
while($worker->work());
function my_task_fn($job) {
echo $job->handle(); // both workers show same job #, I want each worker getting a different job
sleep(10);
}

你所描述的不应该发生,我已经为你提供了一个例子。在辅助角色响应响应之前,客户端脚本不会完成。但是您可以通过将"doNormal"更改为"doBackground"来轻松适应。在工作线程函数中放置一个睡眠计数器以减慢工作线程的速度,并将客户端置于循环中以创建大量工作,以使流程更轻松地工作。

客户端代码

// Create our client object
$client = new GearmanClient();
// Add a server
$client->addServer(); // by default host/port will be "localhost" & 4730
echo "Sending jobn";
// Send reverse job
$result = $client->doNormal("reverse", "Hello!");
if ($result) {
echo "Success: $resultn";
}

工作线程代码

// Create our worker object
$worker = new GearmanWorker();
// Add a server (again, same defaults apply as a worker)
$worker->addServer();
// Inform the server that this worker can process "reverse" function calls
$worker->addFunction("reverse", "reverse_fn");
while (1) {
print "Waiting for job...n";
$ret = $worker->work(); // work() will block execution until a job is delivered
if ($worker->returnCode() != GEARMAN_SUCCESS) {
break;
}
}
// A much simple reverse function
function reverse_fn(GearmanJob $job) {
$workload = $job->workload();
echo "Received job: " . $job->handle() . "n";
echo "Workload: $workloadn";
$result = strrev($workload);
echo "Result: $resultn";
return $result;
}

相关内容

  • 没有找到相关文章

最新更新