有哪些應用場景適合用python的gevent來完成?
01-04
一種技術的出現必然是為了解決某種問題,gevent是為了解決什麼問題呢,設想下面這種情況。
你要做一個千人在線的Web聊天室,聊天室需要能夠實時來收發消息。但是,HTTP是無狀態的,也就是說,伺服器沒有直接把消息發給瀏覽器的能力。所以你往伺服器發送數據之後,伺服器沒法把你的消息推送給其他聊天室的人,但有若干方案可以解決這個問題。這裡假設我們採用常見的長輪詢的方案,即客戶端請求服務端獲取最新的消息,伺服器有消息就返回數據,否則將一直保持連接直到超時。這時候,如果千人在線的話,就需要保持1000個連接,如果連接是進程模式或者線程模式,那就要開對應個數的進程或者線程,1000個進程或者線程的切換開銷會消耗太多的資源。
你仔細分析這個聊天室的代碼執行情況,會發現這麼多的進程或者線程大部分時間都是閑的,它們在等瀏覽器發消息,啥事都沒幹。針對這個問題,你可以想到,要一個進程在閑的時候去干其他的事情,等這邊消息到了再回來處理就好了。gevent把這個功能實現了,切換開銷大大降低,系統性能飆升。總結起來就一句話,如果系統資源過的消耗在進程線程切換上面,用gevent!我就說說我用過的場景吧
1.遊戲伺服器,基本是gevent ,tornado,twisted三選一,如遊戲伺服器框架gfirefly2.爬蟲,gevent的pool是個大殺器3.使用gevent加速web應用,如flask搭配gevent,還可以實現長連接(ajax方式),websocketgevent一般高並發用的比較多,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」 和 「==」 的問題?