Python协程 Gevent Eventlet Greenlet

https://zh.wikipedia.org/zh-cn/%E5%8D%8F%E7%A8%8Bhtml

协程能够理解为线程中的微线程,经过手动挂起函数的执行状态,在合适的时机再次激活继续运行,而不须要上下文切换。因此在python中使用协程会比线程性能更好。python

Tornado协程

http://blog.csdn.net/wyx819/article/details/45420017less

上面有大牛分析的Tornado的线程实现,依赖与Tornado的IOLoop,因此不能单独拿出来使用。有几个须要理解的概念:异步

  1. Future对象 用来保存异步获取到的结果,并在set_reslut的时候调用callback方法,把对应的callback方法放到ioloop的callback列表中等待下一次ioloop循环再执行
  2. 装饰器coroutine 在这个装饰器中实现了协程的调度,经过不断的调用next函数来不断获取Future对象,而后每次拿到Future对象在add_callback到ioloop上,等到Future被set_reslut后再次next,直到生成器中抛出Return的异常。

具体的实现过程不是很好描述,调度过程比较复杂,仍是看看参考文章大牛的解析吧。socket

 

Greenlet

生成器实现的协程调度起来很麻烦,并且不是正在乎义上的协程,只是实现的代码执行过程当中的挂起,唤醒操做。而Greenlet这个Stackless的副产品则实现了真正的协程,在使用过程当中经过switch来中断当前执行的函数,切换到另外一个greenlet,在其它的geenlet 中调用switch会激活以前被挂起的协程。函数

Greenlet没有本身的调度过程,因此通常不会直接使用。如下参考文章是Greenlet get started的中文翻译。tornado

http://www.importcjj.com/greenlet-qing-liang-ji-bing-fa-bian-cheng.htmloop

Eventlet

http://blog.csdn.net/gaoxingnengjisuan/article/details/12913275
http://blog.csdn.net/gaoxingnengjisuan/article/details/12914831性能

Eventlet在Greenlet的基础上实现了本身的GreenThread,实际上就是greenlet类的扩展封装,而与Greenlet的不一样是,Eventlet实现了本身调度器称为Hub,Hub相似于Tornado的IOLoop,是单实例的。在Hub中有一个event loop,根据不一样的事件来切换到对应的GreenThread。
同时Eventlet还实现了一系列的补丁来使Python标准库中的socket等等module来支持GreenThread的切换。Eventlet的Hub能够被定制来实现本身调度过程。.net

Gevent

http://xlambda.com/gevent-tutorial/
http://www.open-open.com/lib/view/open1409705174822.html

Gevent的2架马车,libev与Greenlet。不一样于Eventlet的用python实现的hub调度,Gevent经过Cython调用libev来实现一个高效的event loop调度循环。同时相似于Event,Gevent也有本身的monkey_patch,在打了补丁后,彻底可使用python线程的方式来无感知的使用协程,减小了开发成本。

在Python的世界里因为GIL的存在,线程一直都不是很好用,因此就有了各类协程的hack。Gevnet是当前使用起来最方便的协程了,可是因为依赖于libev因此不能在pypy上跑,若是须要在pypy上使用协程,Eventlet是最好的选择。

相关文章
相关标签/搜索