在最新版本的 Swoole Library
中底層提供了一個更便捷的協程併發管理工具:Coroutine\Barrier
協程屏障,或者叫協程柵欄。基於 PHP
引用計數和 Coroutine API
實現。相比於Coroutine\WaitGroup
,Coroutine\Barrier
使用更簡單一些,只需經過參數傳遞或者閉包的use
語法,引入子協程函數上便可。php
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
併發編程的用戶體驗。編程