距離1.0第一個alpha版發(fā)布已有兩年多時間。根據官方網站的信息,1.0版引入了:
新的核心。事件循環(huán)使用libev代替了libevent,原因可以參考這里。而且事件循環(huán)現在是可插拔的了。
新的DNS解析器。有兩個解析器:默認的基于線程池的,適用于Windows和Mac;另一個基于c-ares庫的,適用于Linux。socket模塊中還增加了gethostbyname_ex等多個函數。
新的API。包括gevent.wait()和gevent.iwait()、子進程支持、UDP服務器以及尚處試驗階段的線程池等。
完整的更新可以參考變更日志。
現在gevent已經不是一人項目了,1.0版的貢獻者達到26人,值得注意的是,其中有阿里的陳小玉。
gevent是基于協程的高性能Python網絡庫,相比Twisted、Stackless等,gevent使用libev事件循環(huán),因此速度很快、性能很好,使用greenlet提供高層的同步API,因此非常輕量。
它由俄羅斯出生的程序員Denis Bilenko開 發(fā),Bilenko目前住在荷蘭阿姆斯特丹,是Surfly公司的創(chuàng)始人。他曾經是另一個Python網絡庫Eventlet的開發(fā)者之一,2009年因 為Eventlet無法滿足項目需要,他決定另外開發(fā)一個更輕量的庫,這就是gevent。某種意義上,gevent是從Eventlet項目派生出來 的。[1]
近來,gevent的發(fā)展勢頭不錯,在GitHub上的關注度已經超過Eventlet,有青出于藍而勝于藍的意思。(當然Eventlet還剩一個優(yōu)勢,OpenStack的網絡通信是基于它的。)距離挑戰(zhàn)Twisted,可能還有一段距離。不過高性能總是利器,ZeroMQ和Nginx的先例在那里。
有名的案例里,Omegle因為性能問題從Twisted遷移到了gevent,Meebo和Spotify的情況類似,Twilio是兩者并用。
相關技術資料
StackOverflow,其中關于Twisted和gevent等Python網絡庫的選型討論可以參考這里和這里。
Bilenko在2013 EuroPython會議上的演講稿
Mixpanel使用gevent的經驗總結(2011年),中文翻譯
CSDN網友Ewing333翻譯的gevent文檔(2012年5月)
OSChina的gevent頁面
話說pycon沒有白去阿,了解了很多以前不知道的東西,比如說協程,gevent,greenlet,eventlet。說說協程,進程和線程大家平時 了解的都比較多,而協程算是一種輕量級進程,但又不能叫進程,因為操作系統(tǒng)并不知道它的存在。什么意思呢,就是說,協程像是一種在程序級別來模擬系統(tǒng)級別 的進程,由于是單進程,并且少了上下文切換,于是相對來說系統(tǒng)消耗很少,而且網上的各種測試也表明,協程確實擁有驚人的速度。并且在實現過程中,協程可以 用以前同步思路的寫法,而運行起來確是異步的,也確實很有意思。話說有一種說法就是說進化歷程是多進程->多線程->異步->協程,暫 且不論說的對不對,單從諸多贊譽來看,協程還是有必要理解一下的。
比較慚愧,greenlet沒怎么看就直接看gevent,官方文檔還是可以看看的,尤其是源碼里的examples都相當不錯,有助于理解gevent的使用。
gevent封裝了很多很方便的接口,其中一個就是monkey
from?gevent?import?monkey
monkey.patch_all()
這樣兩行,就可以使用python以前的socket之類的,因為gevent已經給你自動轉化了,真是超級方便阿。
而且安裝gevent也是很方便,首先安裝依賴libevent和greenlet,再利用pypi安裝即可
sudo apt-get install libevent-dev
sudo apt-get install python-dev
sudo easy-install gevent
然后,gevent中的event,有wait,set等api,方便你可以讓某些協程在某些地方等待條件,然后用另一個去喚醒他們。
再就是gevent實現了wsgi可以很方便的當作python的web server服務器使。
Links: