swoole协程阻塞问题

swoole中协程被阻塞

demo.php:

Co::set([
    'trace_flags' => SWOOLE_TRACE_CLOSE
]);


$chan = new \Swoole\Coroutine\Channel();
function task1(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}
function task2(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}
go("task1", $chan);
go("task2", $chan);
go(function () use ($chan){
    while(!$chan->isEmpty()) {
        var_dump($chan->pop());
    }
});

现象:执行php demo.php长时间阻塞

阅读 4.8k
2 个回答

因为 $chan->isEmpty() === true
while 里面的循环不会被执行
阻塞的原因是因为 $chan 容量为默认为1
第二个push阻塞了

只跑一个协程,为什么立即就退出了?@探索者

$chan = new \Swoole\Coroutine\Channel();
function task1(\Swoole\Coroutine\Channel $chan) {
    Co::sleep(0.005);
    $chan->push([__METHOD__=>__LINE__]);
}
go("task1", $chan);
go(function () use ($chan){
    // isEmpty===true,跳过执行
    while(!$chan->isEmpty()) {
        var_dump($chan->pop());
    }
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进