尝试了解 Channel (管道)
的特性
// 由于\Swoole\Corutine\Channel要配合协程使用,所以这里直接使用\Swoole\Channel
$chan = new \Swoole\Channel(100);
$chan->push('1');
$chan->push('2');
$chan->push('3');
$chan->push('4');
$chan->push('querying');
$chan->push('blog');
var_dump($chan->pop());
var_dump($chan->pop());
var_dump($chan->pop());
var_dump($chan->pop());
根据以上代码,可以做出以下尝试:
- 执行这段代码之后,可以发现依次输出1,2,3,4
- 如果再多执行两次
var_dump($chan->pop());
可以发现,也会输出querying
,blog
- 调整代码
push
的顺序,发现pop
的结果顺序与push
的顺序相关
进行以上三点尝试之后,可以发现:
即使调整不同数据
push
的顺序,发现pop
拿出的结果,是先push
的先pop
出来!
channel
(管道)的特性其实跟 队列 是一样的:先进先出
Channel在不同协程中的使用
$chan = new \Swoole\Coroutine\Channel(1200);
// 生产者协程
go(function() use ($chan){
$i = 0;
do{
$i++;
var_dump('放置数据');
$chan->push($i);
$chan->push($i*10);
\Co::sleep(0.5);
}while(1);
});
// 消费者协程
go(function() use ($chan){
do{
$data = $chan->pop();
var_dump('取出数据');
var_dump($data);
\Co::sleep(0.5);
}while(1);
});
// 消费者协程
go(function() use ($chan){
do{
$data = $chan->pop();
var_dump('取出数据');
var_dump($data);
\Co::sleep(0.5);
}while(1);
});
-
执行以上代码,死循环hold住进程(常驻进程),协程之间通过
\Co::sleep()
进行切换 -
从
var_dump
出来的内容,可以看出生产者协程不断往Channel中放置数据,消费者协程不断从Channel取出数据
多进程异步处理场景中,主要是以redis的作为队列进行数据通信!这里的多协程处理数据的应用可以进行类比
另一篇博文:《swoole的协程应用》有更加详细的demo
2018-08-24 19:19:27 星期五