首页 Order Swoole4 正文

Swoole4 [协程高级] Barrier

金鹏头像 金鹏 Swoole4 2022-01-02 14:01:38 0 645
导读:Coroutine\Barrier在SwooleLibrary中底层提供了一个更便捷的协程并发管理工具:Coroutine\Barrier协程屏障,或者叫协程栅栏。基于P...

Coroutine\Barrier

Swoole Library 中底层提供了一个更便捷的协程并发管理工具:Coroutine\Barrier 协程屏障,或者叫协程栅栏。基于 PHP 引用计数和 Coroutine API 实现。

相比于 Coroutine\WaitGroupCoroutine\Barrier 使用更简单一些,只需通过参数传递或者闭包的 use 语法,引入子协程函数上即可。

Swoole 版本 >= v4.5.5 时可用。

使用示例

use Swoole\Coroutine\Barrier;
use Swoole\Coroutine\System;
use function Swoole\Coroutine\run;
use Swoole\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 是一个比 WaitGroupChannel 更易用的并发控制器,大幅提升了 PHP 并发编程的用户体验。

本文地址:https://www.jinpeng.work/?id=95
若非特殊说明,文章均属本站原创,转载请注明原链接。
广告3

欢迎 发表评论:

  • 请填写验证码

日历

«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930

控制面板

您好,欢迎到访网站!
  查看权限
广告2

退出请按Esc键