[譯]libev和libevent的設計差異


本文譯自what's the difference between libev and libevent? 作者是libev作者

 

[問]兩個庫都是為異步io調度而設計,在Linux上都是使用epoll機制,在FreeBSD上則都是kqueue,還有諸如此類的很多相通之處。

 

除了這些表面上的差別外,其實這兩者根本的區別在哪里呢?比如架構上,或者設計哲學上。

 

[答]就設計哲學來說,libev的誕生,是為了修復libevent設計上的一些錯誤決策。例如,全局變量的使用,讓libevent很難在多線程環境中使用。watcher結構體很大,因為它們包含了I/O,定時器和信號處理器。額外的組件如HTTP和DNS服務器,因為拙劣的實現品質和安全問題而備受折磨。定時器不精確,而且無法很好地處理時間跳變。

 

libev試圖改進所有這些缺陷,例如避免使用全局變量,轉而在所有函數中,使用上下文變量來代替。每個事件類型,使用單獨的watcher類型(一個I/O watcher在64位機器上,只需要56字節。而libevent需要136字節)。允許額外的事件類型,例如基於掛鍾的計時器,或者單調時間,線程內中斷,准備並檢查watchers來嵌入其他事件循環,或者被用於其他事件循環來嵌入。

 

額外組件的問題,是通過直接去掉額外組件來解決的,這樣libev就可以小而美,快速高效了。但你也需要從其他地方尋找http庫。因為libev沒有帶上。(例如,有一個庫叫libeio,可以完成異步IO的工作,也可以和libev配合使用)。

 

總而言之,libev試圖做好一件事而已(目標是成為POSIX的事件庫),這是最高效的方法。libevent則嘗試給你全套解決方案(事件庫,非阻塞IO庫,http庫,DNS客戶端)

 

一句話總結,libev嘗試追隨UNIX工具箱哲學,一次只干一件事,每次都做到最好。

 

注意,這是libev的設計哲學,我想我作為libev的設計者,有着足夠的發言權。至於這些設計目標有沒有實際達到,或者這些設計哲學是否堅實可靠,則交由你來評判。

 

[譯者注]第一次注意到libev,是在gevent的開發者blog上的這篇libev and libevent,它簡要說明了gevent從libevent切換到libev的決策過程。回顧gevent,它實際需要的只是一個負責事件循環的C庫,在上面的HTTP庫和DNS庫,都可以交由標准庫強大得不得了的python完成。因此,作者的選擇還是非常明智的。

 

從Libevent 2.0來看,libevent團隊已經意識到上述的問題,也提取出了event loop這個上下文context,但是在具體的DNS解析,HTTPS連接等等,還是有種力不從心的感覺。作為libevent的使用者,我們經歷了libevent的試錯階段,發現HTTPS實現不行,再切換到libcurl去,與其這樣,倒不如直接不提供該功能呢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM