看tornado源码的时候,意外看到了coroutine这个东西,觉得十分有意思,去问了端神和July大神后发现原来Go和Erlang的高并发都是用coroutine来实现的,Lua中coroutine的概念也是十分常用。后面去百度了一下,发现当前并发模型最火的也就是nodejs的callback模型和coroutine模型(据说node的callback模型的性能比coroutine更强大,怪不得死月他们都学node去了)。
Python原生不支持crountine,不过python原生的生成器倒是挺像coroutine。但是由于生成器无法指定将执行权限交给谁,所以对于异步编程来说意义不是很大。幸好有了gevent这个python的coroutine框架。
1 | from gevent import monkey |
1 | from gevent import monkey |
其实是这样的,coroutine并不是并行,它不会创建多个进程或线程,而是始终运行在一个线程里面。但是当每个coroutine执行遇到IO的时候,它会交出执行权限gevent会将执行权限交给其他没有在IO等待状态的coroutine,如果全部都在等待状态,gevent会不断轮询,类似与epoll。也正式由于coroutine始终执行在一条线程中所以它使用不了多核的资源。
1 | import gevent, random |
1 | from gevent import monkey |
看了Qcon上豆瓣清风大神的分享,顿时觉得有点明白github是怎么玩的了,以后大家多多给我做code review吧。
- http://blog.jobbole.com/77240/ 这篇文章是讲coroutine的实现的。简单地说就是不断地将每个coroutine地栈帧从堆移到栈然后又从栈移到堆,从而获得coroutine的切换。
- http://xlambda.com/gevent-tutorial/ 中文教程
- http://www.gevent.org/ 官方教程