首页 > 技术文章 > Swoole 协程屏障(CoroutineBarrier)的使用

uuuuu55 2021-03-05 10:22 原文

在最新版本的 Swoole Library 中底层提供了一个更便捷的协程并发管理工具:Coroutine\Barrier 协程屏障,或者叫协程栅栏。基于 PHP 引用计数和 Coroutine API 实现。相比于Coroutine\WaitGroupCoroutine\Barrier使用更简单一些,只需通过参数传递或者闭包的use语法,引入子协程函数上即可。

使用实例

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 是一个比 WaitGroup 和 Channel 更易用的并发控制器,大幅提升了 PHP 并发编程的用户体验。

以上内容希望帮助到大家,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文免费获取可以微信搜索关注公众号:PHP开源社区,或者访问:

2021金三银四大厂面试真题集锦,必看!

四年精华PHP技术文章整理合集——PHP框架篇

四年精华PHP技术文合集——微服务架构篇

四年精华PHP技术文合集——分布式架构篇

四年精华PHP技术文合集——高并发场景篇

四年精华PHP技术文章整理合集——数据库篇

推荐阅读