转:libev和libevent的设计差异
轉:http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese.html
?
[譯]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去,與其這樣,倒不如直接不提供該功能呢
?
總結
以上是生活随笔為你收集整理的转:libev和libevent的设计差异的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VIM 命令速查卡
- 下一篇: Java笔试题解答和部分面试题