tornado為什麼使用epoll的水平觸發模式,而不是邊緣觸發模式?
01-08
我們知道tornado是一個非同步非阻塞web框架,我們看到tornado的文檔中有這樣的描述,class tornado.ioloop.IOLoop
A level-triggered I/O loop.We use epoll (Linux) or kqueue (BSD and Mac OS X) if they are available, or else we fall back on select(). If you are implementing a system that needs to handle thousands of simultaneous connections, you should use a system that supports either epoll or kqueue.
為什麼採用水平觸發,而不是邊緣觸發呢?
當epoll處於ET(邊沿觸發)時,當有數據到達,epoll_wait返回EPOLLIN事件,在這次的處理過程中,如果沒有從socket中的讀取數據,那麼再次調用epoll_wait,它是不會返回EPOLLIN的事件的。而LT(水平觸發)則不同,照樣會返回EPOLLIN事件,讓你處理這個socket。
epoll的幫助中指出,使用ET模式,可以便捷的處理EPOLLOUT事件,省去打開與關閉EPOLLOUT的epoll_ctl(EPOLL_CTL_MOD)調用。從而有可能讓你的性能得到一定的提升。
例如你需要寫出1M的數據,寫出到socket 256k時,返回了EAGAIN,ET模式下,當再次返回EPOLLOUT時,繼續寫出待寫出的數據,當沒有數據需要寫出時,不處理直接略過即可。而LT模式則需要先打開EPOLLOUT,當沒有數據需要寫出時,再關閉EPOLLOUT(否則會一直會返回EPOLLOUT事件) 總體來說,ET處理EPOLLOUT方便高效些,LT不容易遺漏事件、不易產生bug至於tornado作為python的伺服器,可以認為IO負載不會特別高,不容易產生EPOLLOUT事件,適用LT,而nginx作為高性能的通用伺服器,則使用ET。1. 使用水平觸發可以在沒有epoll的時候降級到select
2.水平觸發對應用程序更簡單,也更適合http這種請求響應模式。(讀完就寫,不用管寫狀態)
推薦閱讀:
※用Python寫一個中國象棋AI?
※為什麼 sqlmap 源碼看起來那麼費勁?
※營銷人想學python,卻被卡在pycharm官網下載不了這環,求助?
※pycharm和eclipse+pydev的對比?
※0基礎小白學python,我想打算學習selenium+python 這一塊,該怎麼辦?