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

时间:2012-10-02 11:16:05

标签: php gearman

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

任何人都可以澄清这些吗?我对这种差异感到很困惑。

2 个答案:

答案 0 :(得分:8)

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

运行顺序 - 当您通过do和runTasks运行某些​​任务时,其优先级高于任务。因此,运行顺序将通过:

  1. 所有关注高度优先级(GearmanClient :: doHigh()或
    GearmanClient :: doHighBackground())
  2. 具有高优先级的所有任务(GearmanClient :: addTaskHigh()或 GearmanClient :: addTaskHighBackground())
  3. 所有人都做正常的优先事项
  4. 具有正常优先级的所有任务
  5. 都是低优先级
  6. 所有优先级低的任务
  7. <强>目的:

    任务 - 将此用于简短任务,当您不关心完成时间或进度如何时

    执行 - 将此用于复杂作业或需要检查进度时。为此目的有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是字符串,因此您可以将其存储在某处,然后随时进行检查。

答案 1 :(得分: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()来执行工作。请注意,需要有足够的工作人员来完成所有并行运行的任务。