【问题标题】:whats the difference between a task and do任务和做有什么区别
【发布时间】:2012-10-02 11:16:05
【问题描述】:

在查看 php gearman 文档时,我看到有任务和执行,它们都有背景和非背景,它们也都有高低和正常。

谁能澄清这些?我只是对区别感到很困惑。

【问题讨论】:

  • 你想用它做什么??
  • 嗯,有人告诉我,它比一直设置 cron 作业要好。但我正在努力寻找差异,如果一个比另一个更好,以及如何使用它,我在网上看到了很多例子,但很难找到两者之间的差异。

标签: php gearman


【解决方案1】:

有两个区别:运行顺序和目的。

运行顺序 - 当您通过 do 和 runTasks 运行某些任务时,do 的优先级高于任务。所以运行顺序将是:

  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;
    }
}

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";

$job_handle 是字符串,因此您可以将其存储在某个地方,然后随时查看。

【讨论】:

  • doBackground 和 doNormal 有什么区别?我需要让工作人员将数据返回给客户端。
  • doBackground 导致客户端不等待作业完成并立即返回。您可以稍后异步检查状态。 doNormal 强制客户端等待工作人员响应。
【解决方案2】:

嗯,我已经为你做了一些研究,因为我也想过这个问题。

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

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

你可以建立一个列表,然后在你 GearmanClient::Run() 时并行运行它们。

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

任务

添加一个与其他任务并行运行的任务。调用此方法让所有任务并行运行,然后调用 GearmanClient::runTasks() 来执行工作。请注意,需要有足够多的工作人员可供任务全部并行运行。

【讨论】:

猜你喜欢
  • 2017-02-10
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多