gpt4 book ai didi

php - ReactPHP 在循环内阻塞

转载 作者:搜寻专家 更新时间:2023-10-31 21:23:40 26 4
gpt4 key购买 nike

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

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

场景:

我有三个 worker 。

获取.php解析.phpnotify.php

fetch.phpnotify.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,这可能是一些菜鸟错误。

问题是我正在使用递归并且阻塞了循环还是其他原因。

也许没有实现循环来解决我正在尝试解决的这类问题?

最佳答案

我明白了。

问题在于递归。

在我的第一个任务 fetch 中看到我只有一个 echo 'FETCH';

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

我发布这个问题后立即想通了。

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

关于php - ReactPHP 在循环内阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40996677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com