通过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数据未消费;太大,消费者会让出控制流),会带来意想不到的情况。
网友评论