4

我正在尝试实现我的工人的并行执行,我正在使用ReactPHP它来帮助我。https://github.com/reactphp/react

但我没有得到我期望得到的行为。

设想:

我有三个工人。

fetch.php parse.php notify.php

fetch.php并且notify.php没有预先要求的条件来运行,因此它们可以并行运行并且应该首先运行。

parse.php需要等待fetch.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 回答