首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环内的ReactPHP阻塞

循环内的ReactPHP阻塞
EN

Stack Overflow用户
提问于 2016-12-06 13:34:33
回答 1查看 985关注 0票数 4

我正在努力实现我的工作人员的并行执行,我正在使用ReactPHP来帮助我。https://github.com/reactphp/react

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

设想情况:

我有三个工人。

fetch.php parse.php notify.php

fetch.phpnotify.php没有预先设定好的运行条件,因此它们可以并行运行,应该先运行。

parse.php需要等待fetch.php完成工作,然后它应该执行。

所以我有我的父脚本process.php,所有的魔法都在这里发生。

代码语言:javascript
复制
$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'      
    ];
}

因此,没有得到这个输出:

代码语言:javascript
复制
FETCH
NOTIFY
PARSE

我得到了

代码语言:javascript
复制
FETCH
PARSE
NOTIFY

脚本等待解析完成,然后转到下一个任务,即通知。

所以我做错了一些事情,因为我是第一次和ReactPHP玩,这可能是新秀犯的错误。

是我使用递归的问题,它阻塞了循环或其他什么东西。

也许循环没有被实现来解决我想要解决的这类问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 13:45:49

这样啊,原来是这么回事。

问题在于递归。

在我的第一个任务获取中,我只有一个echo 'FETCH';

它是即时的,因此它立即获得数据,并进入.on(' data ')事件,并再次使用新数组调用函数。所以这就是我遇到的设计问题。

我发了这个问题后马上就想出来了。

如果我编辑了我的fetch.php工作者,并在sleep(1)之前设置了echo,那么我首先会通知worker输出字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40996677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档