協程能夠理解爲線程中的微線程,經過手動掛起函數的執行狀態,在合適的時機再次激活繼續運行,而不須要上下文切換。因此在python中使用協程會比線程性能更好。python
上面有大牛分析的Tornado的線程實現,依賴與Tornado的IOLoop,因此不能單獨拿出來使用。有幾個須要理解的概念:異步
具體的實現過程不是很好描述,調度過程比較複雜,仍是看看參考文章大牛的解析吧。socket
生成器實現的協程調度起來很麻煩,並且不是正在乎義上的協程,只是實現的代碼執行過程當中的掛起,喚醒操做。而Greenlet這個Stackless的副產品則實現了真正的協程,在使用過程當中經過switch來中斷當前執行的函數,切換到另外一個greenlet,在其它的geenlet 中調用switch會激活以前被掛起的協程。函數
Greenlet沒有本身的調度過程,因此通常不會直接使用。如下參考文章是Greenlet get started的中文翻譯。tornado
http://www.importcjj.com/greenlet-qing-liang-ji-bing-fa-bian-cheng.htmloop
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
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是最好的選擇。