在最新版本的Swoole库底层提供了一个更方便的协程并发管理工具:Coroutine\Barrier协程屏障,即协程屏障。基于PHP引用计数和CoroutineAPI实现。与Coroutine\WaitGroup相比,Coroutine\Barrier更易于使用,只需通过参数传递或闭包使用语法引入子协程功能即可。使用示例useSwoole\Coroutine\Barrier;useSwoole\Coroutine\System;usefunctionSwoole\Coroutine\run;useSwoole\Coroutine;run(function(){$barrier=Barrier::make();$count=0;$N=4;foreach(range(1,$N)as$i){Coroutine::create(function()use($barrier,&$count){System::sleep(0.5);$count++;});}Barrier::wait($barrier);assert($count==$N);});执行过程首先使用Barrier::make()创建一个新的协程屏障,并在子协程中使用use语法传递屏障并增加引用计数。在需要等待的位置添加Barrier::wait($barrier)。此时当前协程会自动挂起,等待引用协程屏障的子协程退出时$会减少。barrier对象的引用计数直到为0。当所有子协程完成任务处理并退出时,$barrier对象的引用计数为0。在$barrier对象的析构函数中,底层会自动恢复从Barrier中挂起的协程::wait($barrier)函数中返回的Coroutine\Barrier是一个比WaitGroup和Channel更易用的并发控制器,大大提高了PHP并发编程的用户体验。
