swoole协程之channel

栏目: PHP · 发布时间: 5年前

内容简介:通过swoole协程入门,了解到协程的基本写法。更准确一点,是独立、无执行顺序的任务。那有依赖关系或者执行顺序有关的任务怎么办呢?

前言

通过swoole协程入门,了解到协程的基本写法。

更准确一点,是独立、无执行顺序的任务。

那有依赖关系或者执行顺序有关的任务怎么办呢?

靠channel了!

Channel特点

与容量有关

如果channel未满,push不阻塞,如果已满,push让出控制流;

如果channel为空,pop让出控制流

看例子:depend_co.php

<?php
// 设置一个容量为50的channel
$chan = new \Swoole\Coroutine\Channel(50);
function t4(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);    #1
    $chan->push([__METHOD__=>__LINE__]);    #2
}

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

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

// cousume协程:c1
go(function() use($chan) {
    // chan元素个数
    $chanNum = 3;
    // chan有数据时
    while($chanNum>0) {    #7
        $item = $chan->pop();    #8
        var_dump($item);    #9
        $chanNum --;
    }
});

分析

3个生产者协程(t4/t5/t6),1个消费者协程(用c1描述)

#1 t4遇到Co::sleep, 让出控制流,挂起

#3 t5,类似于t4, 挂起

#5 t6,类似于t4, 挂起

#7 c1开始执行,while循环为真,执行channel::pop()

#8 可能情况:channel为空,c1 让出控制流,挂起

#8 可能情况:channel非空,pop弹出数据,while循环继续

如果while循环为假,c1执行结束

如果while循环为真,进入channel::pop()流程

...5ms后...

t4 恢复执行 (t4/t5/t6 sleep时间相同,因此都有可能先恢复执行,但同时只能有一个恢复,为描述简单以t4为例)

#2 t4写入channel数据,此时channel非空

#8 如果有消费者协程,控制流发生变化,消费者协程 c1恢复执行 (思考:如果c1的while循环为假已经结束,会发生什么呢?)

c1协程 运行直到让出控制流 或者结束;

控制流回到t4协程,t4协程没有后续代码,执行结束;(问题:控制流有可能回到其他协程t5/t6嘛?还是一定会回到t4协程)

t5(t6) 恢复执行 ,流程类似于t4的执行流程

注意事项

channel的容量很重要,过小的容量导致生产者自动让出控制流而不能执行;

消费者,需要判断生产者个数,来确定循环次数或循环结束边界,如果判断错误(太小,导致channel数据未消费;太大,消费者会让出控制流),会带来意外的结果。

总结

回到文章的开头,好像我们是想介绍有依赖关系、调用顺序的任务怎么写?

你肯定已经猜到了,那就是先导任务放在生产者协程,后续任务放在消费者协程

通过channel的机制,保障任务的先后执行顺序

channel解决了协程间通信的问题,同时也提供了一种任务调度的方式。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C语言进阶

C语言进阶

牟海军 / 机械工业出版社 / 2012-7 / 59.00元

C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量......一起来看看 《C语言进阶》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具