Epoll 模型簡介

發表於2016-01-10

網路IO的模型中,之前介紹了select模型。select 確實是一個簡明好用的模型。可是現在的伺服器卻越來越少採取這樣的模型,原因之一就是它的效能讓人擔憂。雖然後來升級了poll模型,本質上還是和select模型類似。當然,當一個技術逐漸被人放棄的時候,很大程度上是有了更好的替代方案。沒錯,還有select/poll模型更好的網路IO模型,就是今天介紹的主角—Epoll。在很多地方,epoll都是高效能代名詞,準確的說epoll是Linux核心升級的多路複用IO模型,在Unix和MacOS上類似的則是 Kqueue。

epoll優點

select的缺點之一就是在網路IO流到來的時候,執行緒會輪詢監控檔案陣列,並且是線性掃描,還有最大值的限制。相比select,epoll則無需如此。伺服器主執行緒建立了epoll物件,並且註冊socket和檔案事件即可。當資料抵達的時候,也就是對於事件發生,則會呼叫此前註冊的那個io檔案。

先看一個python的epoll例子,採用了網路上一段著名的code:

可見epoll使用也很簡單,並沒有過多複雜的邏輯,當然主要是在系統層面封裝的好。至於Epoll的原理,也不是三言兩語可以解釋清楚,作為開發者,先學會如何使用API。

epoll與tornado

既然epoll是一種高效能的網路io模型,很多web框架也採取epoll模型。大名鼎鼎tornado是python框架中一個高效能的非同步框架,其底層也是來者epoll的IO模型。
當然,tornado是跨平臺的,因此他的網路io,在linux下是epoll,unix下則是kqueue。幸好tornado都做了封裝,對於開發者及其友好,下面看一個tornado寫的回顯例子。

上面的程式碼來者tornado的模組IOLoop原始碼的文件,很簡明的介紹了在tornado中如何使用網路IO。當然具體的封裝實現,可以參考tornado原始碼獲知,在此不做介紹了。

相關文章