协程和多线程相比,一个主要的优势就在于主动让出CPU,而不是CPU抢占。
这样,很多为了避免抢占的锁,就可以避免了。
但是swoole选用了隐式的协程,这样对于上层代码来讲,CPU还是被其他协程抢占的(而不是通过yield等方式让出的),那就可能导致很多抢占导致的问题。
比如mysql和redis查询到一半,mysql client的状态被其他协程修改了,等等。
不知道为何swoole采用了隐式的协程,以及这种做法会有坑吗?
协程和多线程相比,一个主要的优势就在于主动让出CPU,而不是CPU抢占。
这样,很多为了避免抢占的锁,就可以避免了。
但是swoole选用了隐式的协程,这样对于上层代码来讲,CPU还是被其他协程抢占的(而不是通过yield等方式让出的),那就可能导致很多抢占导致的问题。
比如mysql和redis查询到一半,mysql client的状态被其他协程修改了,等等。
不知道为何swoole采用了隐式的协程,以及这种做法会有坑吗?
如果你自己管理协程,手动yield
,那么你需要自己去判断事件是否就绪。此时,Swoole
就需要暴露更多C
底层的API
来给你使用。
而且你自己管理yield
协程,如果你忘记了resume
,那么很容易造成内存泄漏。
4 回答14k 阅读✓ 已解决
5 回答8.3k 阅读✓ 已解决
1 回答3.7k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
2 回答2.1k 阅读
1 回答1.1k 阅读✓ 已解决
我觉得就是让协程用起来更加方便了,而使用
yield
实现起来是相当晦涩的。yield
的实现参见鸟哥博客: 在PHP中使用协程实现多任务调度