Swoole 協程屏障(Coroutine\Barrier)的使用

在最新版本的 Swoole Library 中底層提供了一個更便捷的協程併發管理工具:Coroutine\Barrier 協程屏障,或者叫協程柵欄。基於 PHP 引用計數和 Coroutine API 實現。相比於Coroutine\WaitGroupCoroutine\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 是一個比 WaitGroupChannel 更易用的併發控制器,大幅提高了 PHP 併發編程的用戶體驗。編程

相關文章
相關標籤/搜索