4

私はワーカーの並列実行を実現しようとしていますが、ReactPHP私を助けるために使用しています。https://github.com/reactphp/react

しかし、私が期待している動作が得られません。

シナリオ:

私には3人の労働者がいます。

fetch.php parse.php notify.php

fetch.phpnotify.php実行するための前提条件がないため、並行して実行でき、最初に実行する必要があります。

parse.phpfetch.php作業が完了するまで待機する必要があり、その後実行する必要があります。

だから私はprocess.phpすべての魔法が起こる私の親スクリプトを持っています。

$tasks = ['fetch', 'notify'];

forkProcess($tasks);

function forkProcess($tasks)
{
   if (empty($tasks)) return false;

   $loop = React\EventLoop\Factory::create();

   foreach ($tasks as $task) {

       $process = new React\ChildProcess\Process("php $task.php");

       $loop->addTimer(0.001, function($timer) use ($process, $task) {
           $process->start($timer->getLoop());
           $process->stdout->on('data', function($output) use ($task) {
                echo $output;
                $subTasks = getDependentTask($task);
                forkProcess($subTasks);
           });
       });
   }

   $loop->run();

}

function getDependentTask($task)
{
    if ($task != 'fetch') return [];     
    return [
        'parse'      
    ];
}

したがって、この出力を取得する代わりに:

FETCH
NOTIFY
PARSE

私は得ています

FETCH
PARSE
NOTIFY

そして、スクリプトは解析が完了するのを待ってから、通知である次のタスクに進みます。

だから私は何か間違ったことをしています.ReactPHPを初めていじっているので、おそらく初歩的な間違いです.

私が再帰を使用していて、それがループなどをブロックしているという問題です。

私が解決しようとしているこの種の問題を解決するためにループが実装されていないのでしょうか?

4

1 に答える 1

2

わかった。

問題は再帰にあります。

私の最初のタスクフェッチを見てください。echo 'FETCH';

そしてインスタントなのですぐにデータを取得し、.on('data') イベントに入り、新しい配列で関数を再度呼び出します。それは私が抱えている設計上の問題です。

この質問を投稿した直後にそれを理解しました。

ワーカーを編集して、最初に文字列を出力するようにワーカーに通知する前にfetch.php設定した場合。sleep(1)echo

于 2016-12-06T13:45:49.513 に答える