内容简介:通过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解决了协程间通信的问题,同时也提供了一种任务调度的方式。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据结构与算法分析
Mark Allen Weiss / 冯舜玺 / 电子工业出版社 / 2016-8 / 89.00元
本书是数据结构和算法分析的经典教材,书中使用主流的程序设计语言C++作为具体的实现语言。书中内容包括表、栈、队列、树、散列表、优先队列、排序、不相交集算法、图论算法、算法分析、算法设计、摊还分析、查找树算法、k-d树和配对堆等。本书把算法分析与C++程序的开发有机地结合起来,深入分析每种算法,内容全面、缜密严格,并细致讲解精心构造程序的方法。一起来看看 《数据结构与算法分析》 这本书的介绍吧!