2

GearmanとPHPですでに処理されている処理ジョブを並列化したいと思います。何度も電話することの違いがわかりませんdoBackground()

$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");
$gmclient->doBackground("reverse", "Hello!");

十分な数のワーカーが登録されており、自分のPIDで実行されています。したがって、3つのジョブは3人の異なるワーカーによって並行して実行されます。

またはaddTask()、ドキュメントで述べられているように、並列化のために明示的に使用します。

$gmc->addTask("reverse", "Hello World!", null, "1");
$gmc->addTask("reverse", "!dlroW olleH", null, "2");
$gmc->addTask("reverse", "!dlroW olleH", null, "3");

$gmc->runTasks()

ご協力いただきありがとうございます

4

2 に答える 2

4

違いは、追加されたすべてのタスクが完了runTasks()するまでブロックされることです。addTask()最後の例は、3 つのタスクがすべて完了すると完了します (sleep()実際にそれを確認するための呼び出しを追加します)。一方、最初の例は、タスクをギアマンドに切り替え、スクリプトの実行を続行します。

を使用addTask()して独立したタスクをグループ化すると (ただし関連している可能性があります)、一連のタスクを簡単に実行してから、以前のすべてのタスクが完了したことを前提とする操作を実行できます。たとえば、4 つの異なる解像度で画像のサイズを変更し、4 つのタスクがすべて完了した後に画像をアクティブに設定することができます。これは 4 つの呼び出しでrunTasks()簡単に実装できます。1 回でイメージのステータスを変更します。一方、doBackground では、gearmand に送信したタスクの状態をポーリングして、完了したことを知る必要があります。addTask()runTasks()

于 2012-05-02T13:18:35.403 に答える
2

ここで取り上げる 1 つの良い点は次のとおりです。

ワーカーが死んでいるか、到達できない場合は、doBackground の方がはるかに優れています。なぜなら、ギアマンはとにかくワークロードを受け取り、ワーカーが存在するまで待って、ほとんどの場合(少なくとも私の経験では)ギアマンを使用してこのように作業するよりも優れています、タスク、ワークロードを送信し、それらが非同期で完了するのを待ちます。

したがって、システムがフォールトトレラントでなければならない場合は、おそらく addTask の代わりに doBackground を使用する必要があります。

これが他の人にも解決できることを願っています...

于 2013-09-25T19:18:47.403 に答える