什么是任务和做什么之间的区别

Woj*_*ech 13 php gearman

当查看php gearman文档时,我看到有任务和做,他们都有背景和非背景,他们也都有高低和正常.

谁能澄清这些?我只是对这种差异感到困惑.

小智 8

有两个不同之处:运行顺序和目的.

运行顺序 - 当您通过do和runTasks运行某些​​任务时,确实具有比任务更高的优先级.所以运行顺序将通过:

  1. 所有这一切都与高优先级(GearmanClient :: doHigh()或
    GearmanClient :: doHighBackground())
  2. 所有具有高优先级的任务(GearmanClient :: addTaskHigh()或GearmanClient :: addTaskHighBackground())
  3. 一切都做正常的优先事项
  4. 所有具有正常优先级的任务
  5. 所有这些都是低优先级的
  6. 所有低优先级的任务

目的:

任务 - 当你不关心它完成或进展如何时,将它用于简短的任务

- 用于复杂的工作或需要检查进度.为此目的有 GearmanJob :: sendStatus():

worker.php

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("sleep13", array('MyWorker', 'sleep13'));
while ($worker->work());

class MyWorker {
    public function sleep13($job) {
        $data = unserialize($job->workload());
        echo 'start ' . $data['id']  . PHP_EOL;

        for($i = 0; $i < 13; $i++) {
            sleep(1);
            $job->sendStatus($i, 13);
        }
        echo 'done ' . $data['id']  . PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

client.php

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

// Run task
$job_handle = $client->doBackground("sleep13", serialize(array('id' => 'normal-1')));

// Check progress
$done = false;
do {
   usleep(300);
   $stat = $client->jobStatus($job_handle);
   if (!$stat[0]) // the job is known so it is not done
      $done = true;
   echo "Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denomintor: " . $stat[3] . "\n";
} while(!$done);

echo "done!\n";
Run Code Online (Sandbox Code Playgroud)

$ job_handle是字符串,所以你可以将它存储在某个地方,然后随时检查它.

  • doBackground使客户端不等待作业完成并立即返回.您可以稍后异步检查状态.doNormal强制客户端等待工作者响应. (2认同)

Sim*_*ett 7

好吧,我已经为你做了一些研究,因为我也考虑过这个问题.

如果你运行它会立即运行(发送到作业服务器) http://www.php.net/manual/en/gearmanclient.donormal.php

运行单个任务并返回结果的字符串表示形式.由GearmanClient和GearmanWorker决定结果的格式.

如果是任务,您可以构建它们的列表,然后在GearmanClient :: Run()时运行它们.

http://www.php.net/manual/en/gearmanclient.addtask.php

任务

添加要与其他任务并行运行的任务.为所有要并行运行的任务调用此方法,然后调用GearmanClient :: runTasks()来执行工作.请注意,需要有足够的工作人员来完成所有并行运行的任务.