我正在努力实现我的工作人员的并行执行,我正在使用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玩,这可能是新秀犯的错误。
是我使用递归的问题,它阻塞了循环或其他什么东西。
也许循环没有被实现来解决我想要解决的这类问题?
发布于 2016-12-06 13:45:49
这样啊,原来是这么回事。
问题在于递归。
在我的第一个任务获取中,我只有一个echo 'FETCH';
它是即时的,因此它立即获得数据,并进入.on(' data ')事件,并再次使用新数组调用函数。所以这就是我遇到的设计问题。
我发了这个问题后马上就想出来了。
如果我编辑了我的fetch.php工作者,并在sleep(1)之前设置了echo,那么我首先会通知worker输出字符串。
https://stackoverflow.com/questions/40996677
复制相似问题