標籤:

有哪些應用場景適合用python的gevent來完成?


一種技術的出現必然是為了解決某種問題,gevent是為了解決什麼問題呢,設想下面這種情況。

你要做一個千人在線的Web聊天室,聊天室需要能夠實時來收發消息。但是,HTTP是無狀態的,也就是說,伺服器沒有直接把消息發給瀏覽器的能力。所以你往伺服器發送數據之後,伺服器沒法把你的消息推送給其他聊天室的人,但有若干方案可以解決這個問題。

這裡假設我們採用常見的長輪詢的方案,即客戶端請求服務端獲取最新的消息,伺服器有消息就返回數據,否則將一直保持連接直到超時。這時候,如果千人在線的話,就需要保持1000個連接,如果連接是進程模式或者線程模式,那就要開對應個數的進程或者線程,1000個進程或者線程的切換開銷會消耗太多的資源。

你仔細分析這個聊天室的代碼執行情況,會發現這麼多的進程或者線程大部分時間都是閑的,它們在等瀏覽器發消息,啥事都沒幹。

針對這個問題,你可以想到,要一個進程在閑的時候去干其他的事情,等這邊消息到了再回來處理就好了。gevent把這個功能實現了,切換開銷大大降低,系統性能飆升。

總結起來就一句話,如果系統資源過的消耗在進程線程切換上面,用gevent!


我就說說我用過的場景吧

1.遊戲伺服器,基本是gevent ,tornado,twisted三選一,如遊戲伺服器框架gfirefly

2.爬蟲,gevent的pool是個大殺器

3.使用gevent加速web應用,如flask搭配gevent,還可以實現長連接(ajax方式),websocket

gevent一般高並發用的比較多,goagent也使用了gevent,openstack使用了eventlet,這是gevent的胞弟


When to use Tornado, when to use Twisted / Cyclone / GEvent / other


適用於非同步IO的高並發場景。如果支持非同步IO都建議使用,以便獲取極高的並發性能。比如網路訪問,讀取文件。

參考這篇文章:Does Asynchronous I/O make sense in OpenStack?。大意是說,非同步IO框架比如eventlet可以減少內存佔用(memory printfeet)但是對於IO密集型和CUP密集型程序意義不大。IO密集型程序一般使用隊列技術來保證系統不會崩潰。CUP密集型系統會採取類似的策略。總之這兩種系統都不適合併發。

我覺得CPU密集型系統適合併行技術。可以使用高算框架(高性能計算)。


推薦閱讀:

Python為什麼代碼縮進不同,輸出結果不同?
為什麼 Python 不是 lexical scoping?
Python 在 for 或者 if 語句後的冒號是冗餘嗎?
Python 會不會替代 MATLAB?
Python 中 「is」 和 「==」 的問題?

TAG:Python | gevent |