亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gevent,eventlet,Twisted,Tornado各有什么區別和優劣

gevent,eventlet,Twisted,Tornado各有什么區別和優劣

蝴蝶不菲 2019-02-25 16:16:28
gevent,eventlet,Twisted,Tornado各有什么區別和優劣
查看完整描述

2 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

python的tornado,tornado應該是最簡單的基于epoll(或kqueue)的httpserver和httpclient,說白了就是封裝了python標準庫的socket和select.epoll(或select.kqueue),所以你也可以照著tornado實現一個媲美nginx的httpserver。當然,為了利用好這個基于epoll的的server,你需要在io處搞個回調函數,只有當你這個io結束,才執行回調函數,如果你這個io不結束,你就執行了回調函數(同步的寫法),產生的后果當然是阻塞(因為一直在等你的io結束),所以用了epoll,你就需要層層回調,代碼肯定很難看的,tornado為了解決這個問題,就加了個裝飾器以及利用了python的yield關鍵字,裝飾器的內部實現的函數名字就叫replace_callback,顧名思義,就是替換回調,yield會使函數或方法凍結,相當于你搞了個回調,但看起來像同步的,當然,這個寫法也有很不方便的地方,但已經比回調爽多了。
tornado雖然是最簡單的基于epoll的httpserver,但坑也非常明顯,前面說了,tornado僅僅封裝了socket和select.epoll,這就導致,木有python數據庫適配器能和tornado無縫對接,只有兩種情況下滿足其一才能把數據庫適配器改造成tornado能用的,第一:這個適配器是純python的,關鍵是socket通信是純python的;第二:這個適配器自帶異步,例如psycopg2??墒蔷退銤M足了上面的情況,你還得用tornado自帶的ioloop和iostream進行封裝,相當麻煩。
gevent就不一樣了,作為另一個python協程庫,里面封裝了C,這導致他不是純python的,無法適用pypy(除非提供cffi接口),gevent的特點是自己搞了個socket和select,通過monkey_patch的方法干掉了python自帶的socket和select,從最底層就開始玩epoll,用gevent做聊天室,不用像tornado那樣還需寫回調函數或yield,只需要調用gevent.event的wait和set方法。
gevent調用數據庫遠比tornado簡單,雖然它對適配器的要求和tornado一樣,但不需要你自己寫代碼封裝(或很少的代碼)

查看完整回答
反對 回復 2019-03-02
  • 2 回答
  • 0 關注
  • 922 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號