ReactPHP 在循环内阻塞
ReactPHP blocking inside a loop
我正在尝试实现我的工作人员的并行执行,我正在使用 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,这可能是一些菜鸟错误。
问题是我正在使用递归并且阻塞了循环还是其他原因。
也许没有实现循环来解决我正在尝试解决的这类问题?
我知道了。
递归有问题。
在我的第一个任务中看到我只有一个 echo 'FETCH';
而且它是即时的,因此它会立即获取数据并进入 .on('data') 事件并使用新数组再次调用函数。所以这是我遇到的设计问题。
我发布这个问题后立即想通了。
如果我编辑我的 fetch.php
worker 并在 echo
之前设置 sleep(1)
我会通知 worker 首先输出字符串。
我正在尝试实现我的工作人员的并行执行,我正在使用 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,这可能是一些菜鸟错误。
问题是我正在使用递归并且阻塞了循环还是其他原因。
也许没有实现循环来解决我正在尝试解决的这类问题?
我知道了。
递归有问题。
在我的第一个任务中看到我只有一个 echo 'FETCH';
而且它是即时的,因此它会立即获取数据并进入 .on('data') 事件并使用新数组再次调用函数。所以这是我遇到的设计问题。
我发布这个问题后立即想通了。
如果我编辑我的 fetch.php
worker 并在 echo
之前设置 sleep(1)
我会通知 worker 首先输出字符串。