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是最好的選擇。

相關文章
相關標籤/搜索