13

PHP Gearman ドキュメントの中を見ると、タスクと do があり、どちらにもバックグラウンドと非バックグラウンドがあり、すべて高低と通常があります。

誰でもこれらを明確にできますか?私はちょうど違いについて本当に混乱しています。

4

2 に答える 2

8

実行順序と目的の 2 つの違いがあります。

実行順序- 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 は文字列なので、どこかに保存していつでも確認できます。

于 2013-08-08T09:11:14.763 に答える
7

私もこれについて考えていたので、あなたのためにいくつかの調査を行いました。

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() を呼び出して作業を実行します。すべてのタスクを並行して実行するには、十分な数のワーカーを利用できる必要があることに注意してください。

于 2012-10-06T15:25:52.460 に答える