美文网首页
swoole协程之channel

swoole协程之channel

作者: traveller227 | 来源:发表于2019-01-14 17:03 被阅读54次

通过swoole协程入门,了解到协程的基本写法。
说的具体一点,是独立、无执行顺序的任务。
那有依赖关系或者执行顺序有关的任务怎么办呢?
靠channel了!

Channel特点
与容量有关
如果channel未满,push不阻塞,如果已满,push让出控制流;
如果channel为空,pop让出控制流

看例子:depend_co.php

<?php
$chan = new \Swoole\Coroutine\Channel(50);
function t4(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}

function t5(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}

function t6(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}
go("t4", $chan);
go("t5", $chan);
go("t6", $chan);


go(function() use($chan) {
// chan元素个数
    $chanNum = 3;
    // chan有数据时
    while($chanNum>0) {
        $item = $chan->pop();
        var_dump($item);
        $chanNum --;
    }
});

说明:
3个协程是生产者,1个协程是消费者

注意事项
channel的容量很重要,过小的容量导致生产者自动让出控制流而不能执行;
消费者,需要判断生产者个数,来确定循环次数或循环结束边界,如果判断错误(太小,导致channel数据未消费;太大,消费者会让出控制流),会带来意想不到的情况。

相关文章

  • swoole协程之channel

    通过swoole协程入门,了解到协程的基本写法。说的具体一点,是独立、无执行顺序的任务。那有依赖关系或者执行顺序有...

  • swoole协程channel元素个数

    channel用于进程内跨协程通讯,按照角色分为生产协程和消费协程。生产协程,在channel已满时,会被挂起;消...

  • swoole 协程(Coroutine)和通道(Channel)

    首先,了解下协程是什么??协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。...

  • kotlin中channel

    channel用于协程之间的通讯,使用send和receive往通道里写入或者读取数据,2个方法为非阻塞挂起函数,...

  • Kotlin Channel学习

    channel用于协程之间的通讯,使用send和receive往通道里写入或者读取数据,2个方法为非阻塞挂起函数,...

  • 22. 信道(channel)

    22. 信道(channel) 什么是信道? 信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到...

  • swoole| swoole 协程初体验

    date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验descri...

  • swoole| swoole 协程用法笔记

    date: 2019-05-01 19:09:34title: swoole| swoole 协程用法笔记 swo...

  • Swoole2.0协程的使用和源码解读

    聊聊Swoole2.0协程 Swoole 2.0正式版发布了。2.0版本最大的更新是增加了对协程(Coroutin...

  • 煮泡面引发的Go协程之并发编程支持

    swoole有协程,Go也有。我们知道与PHP相比,使用swoole和Go除了进程模型不一样,其主要的协程特性是关...

网友评论

      本文标题:swoole协程之channel

      本文链接:https://www.haomeiwen.com/subject/ecdjdqtx.html