PHP Laravel - 如何使用 Spatie Async 实现并发函数

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

我正在尝试与 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 asynchronous
2个回答
2
投票

正如您在文档中看到的,

如果当前 PHP 运行时中未安装所需的扩展(pcntl 和 posix),Pool 将自动回退到同步执行任务。

我高度怀疑您的环境就是这种情况,所以换句话说它只在主线程中运行。

但是,您还需要记住,并发并不意味着并行

在单线程的情况下,仍然可以实现并发,因为它本质上是在进行任务之间的切换。但是,在给定时间只能有一个任务正在运行。

在您的示例中,

sleep
函数本质上halts主线程,因此如果您异步运行4个不同的任务并不重要,它仍然会占用所有任务的总睡眠时间(37秒),因为主线程需要等待那么长时间才能完成所有任务。

当您运行一些 CPU 密集型操作时,同样的情况也适用。在同一线程中异步运行多个任务不会给您带来更快的执行速度,因为只有一个线程在任务之间切换。


0
投票


1”的输出表明您正在从 Web 浏览器调用脚本。那是行不通的。您只能在从命令行运行 PHP 时生成并行进程。

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