在最新版本的 Swoole Library
中底层提供了一个更便捷的协程并发管理工具:Coroutine\Barrier
协程屏障,或者叫协程栅栏。基于 PHP
援用计数和 Coroutine API
实现。相比于Coroutine\WaitGroup
,Coroutine\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
是一个比 WaitGroup
和 Channel
更易用的并发控制器,大幅晋升了 PHP
并发编程的用户体验。