回覆列表
  • 1 # 使用者7727622780694

    先說純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。可是就算滿足了上面的情況,你還得用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一樣,但不需要你自己寫程式碼封裝(或很少的程式碼)後續。。。

  • 中秋節和大豐收的關聯?
  • 建議及改善措施用英文怎麼說?