如何在PHPReact中正确使用asyncawaitAll?

问题描述 投票:0回答:1

我使用异步库制作了一个教育课程https://reactphp.org/async/。想要弄清楚如何在异步模式下正确工作。

所以我制作了3个脚本。所有 3 个脚本都连接到数据库 12 次。

第一个脚本在 26 秒内完成工作 https://github.com/Carsak/php-react/blob/main/create-connections.php

第二个脚本也在 26 秒内完成工作 https://github.com/Carsak/php-react/blob/main/create-connections-async.php

我阅读了文档并发现了这个

前面的示例在循环内使用了await()来强调这是如何 极大地简化了异步操作的消耗。同时, 这个简单的例子没有利用并发执行,因为它会 本质上是在每个操作之间“等待”。为了利用 给定 $function 内的并发执行,您可以“等待” 通过使用单个await() 来实现多个promise 基于 Promise 的原语如下所示:

所以我重写了脚本并制作了 3 个变体 https://github.com/Carsak/php-react/blob/main/create-connections-async- Correct.php 该脚本在 2 秒内完成,并且不会调用连接到数据库。没有调用迭代

有人可以建议为什么这个脚本不起作用吗?

php asynchronous reactphp
1个回答
0
投票

仅供参考:我已经在 GitHub 上给出了这个问题的答案,为了更好的可见性,我还将在这里发布我的答案:

首先要注意的是,

async()
函数只能与await()函数一起工作,并且不会“神奇地”使任何阻塞函数成为非阻塞:

Loop::addTimer(0.5, React\Async\async(function () {
    echo 'a';
    sleep(1); // broken: using PHP's blocking sleep() for demonstration purposes
    echo 'c';
}));

Loop::addTimer(1.0, function () {
    echo 'b';
});

// prints "a" at t=0.5s
// prints "c" at t=1.5s: Correct timing, but wrong order
// prints "b" at t=1.5s: Triggered too late because it was blocked

这意味着,

file_get_contents()
或使用 PDO 在您的示例中仍然会阻塞。您可以通过使用专为非阻塞 I/O 设计的函数和组件来避免这种情况。例如,您可以使用 https://github.com/friends-of-reactphp/mysql,而不是使用阻塞 PDO。

您可以在我们的reactphp/async 文档中阅读有关异步和等待的所有内容。我还在

https://github.com/orgs/reactphp/discussions/546#discussioncomment-7640814
中对
async()
await()进行了快速解释,也许这也有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.