如何理解这里代码的协程执行和情况?

clipboard.png

(补充:29行后面应该加上$chan->push('123');)
以上代码,一个协程在不停地拉取通道的消息(通道被关闭后停止),另一个协程是协程等待4秒后关闭通道,再另一个协程往通道里面塞数据(1秒后就不塞)。我预期的结果是,4秒后关闭通道,并且结束整个程序。但实际并不是。

clipboard.png

co::sleep(4) 前后打印时间显示,整整相差了6秒,这里我就很不理解了。我知道协程的原理是在IO等待的时候,根据优先权执行其他协程的逻辑处理,因此这里执行应该是一开始就拉取通道,开始4秒的等待,并且往通道塞数据,1秒后停止往通道添加数据(这里显示2秒后才结束也表示奇怪),然后应该只有拉取通道的协程在pop处IO挂起,4秒sleep的那个协程应该一只在sleep,那么2~3秒后应该打印出check point 2才对。

也在学习swoole中,也是刚接触线程、协程变成的概念,理论上能理解,但实际操作就一脸懵逼了,求指导。

阅读 2.1k
2 个回答

Swoole协程是单线程的, 最底下的while循环占用了这个进程1秒的CPU时间, 导致底层异步定时器延后了
这种情况需要开启抢占式调度, 防止有恶意协程占用CPU导致其它协程饿死
https://wiki.swoole.com/wiki/...

新手上路,请多包涵

没有看到你push的操作。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏