乐趣区

关于php:Swoole-协程屏障Coroutine\Barrier的使用

在最新版本的 Swoole Library 中底层提供了一个更便捷的协程并发管理工具:Coroutine\Barrier 协程屏障,或者叫协程栅栏。基于 PHP 援用计数和 Coroutine API 实现。相比于 Coroutine\WaitGroupCoroutine\Barrier 应用更简略一些,只需通过参数传递或者闭包的 use 语法,引入子协程函数上即可。

应用实例

use Swoole\Coroutine\Barrier;

Co\run(function () {$barrier = Barrier::make();

    $count = 0;
    $N = 4;

    foreach (range(1, $N) as $i) {\Swoole\Coroutine::create(function () use ($barrier, &$count) {System::sleep(0.5);
            $count++;
        });
    }

    Barrier::wait($barrier);
    
    assert($count == $N);
});

执行流程

  • 先应用 Barrier::make() 创立了一个新的协程屏障
  • 在子协程用应用 use 语法传递屏障,减少援用计数
  • 在须要期待的地位退出Barrier::wait($barrier),这时会主动挂起以后协程,期待援用该协程屏障的子协程退出
  • 当所有子协程实现了工作解决并退出时,底层会主动复原挂起的协程,从 Barrier::wait($barrier) 函数中返回

Coroutine\Barrier 是一个比 WaitGroupChannel 更易用的并发控制器,大幅晋升了 PHP 并发编程的用户体验。

退出移动版