我正在尝试与 spatie/async 并行运行一些函数,但遇到了一些麻烦。我设计了这个快速测试:
应该需要 37 秒并输出 1 2 3 4
sleep(20); echo "<br> 1";
sleep(5); echo "<br> 2";
sleep(10); echo "<br> 3";
sleep(2); echo "<br> 4";
然后使用 spatie,这应该需要 20 秒并返回 4 2 3 1 但仍然需要 37 秒并返回 1 2 3 4
$pool = Pool::create();
$pool
->add(function ()
{
sleep(20); echo "<br> 1";
})
->then(function ($output) {})
->catch(function ($exception) {})
->timeout(function () {})
;
$pool
->add(function ()
{
sleep(5); echo "<br> 2";
})
->then(function ($output) {})
->catch(function ($exception) {})
->timeout(function () {})
;
$pool->add(function () {
sleep(10); echo "<br> 3";
})
->then(function ($output) {})
->catch(function ($exception) {})
->timeout(function () {})
;
$pool
->add(function () {
sleep(2); echo "<br> 4";
})
->then(function ($output) {})
->catch(function ($exception) {})
->timeout(function () {})
;
await($pool);
正如您在文档中看到的,
如果当前 PHP 运行时中未安装所需的扩展(pcntl 和 posix),Pool 将自动回退到同步执行任务。
我高度怀疑您的环境就是这种情况,所以换句话说它只在主线程中运行。
但是,您还需要记住,并发并不意味着并行。
在单线程的情况下,仍然可以实现并发,因为它本质上是在进行任务之间的切换。但是,在给定时间只能有一个任务正在运行。
在您的示例中,
sleep
函数本质上halts主线程,因此如果您异步运行4个不同的任务并不重要,它仍然会占用所有任务的总睡眠时间(37秒),因为主线程需要等待那么长时间才能完成所有任务。
当您运行一些 CPU 密集型操作时,同样的情况也适用。在同一线程中异步运行多个任务不会给您带来更快的执行速度,因为只有一个线程在任务之间切换。
“
1”的输出表明您正在从 Web 浏览器调用脚本。那是行不通的。您只能在从命令行运行 PHP 时生成并行进程。