[python異步 第二篇 ] Linux 異步網絡庫libevent、libev、libuv對比

一、概念:事件、事件循環

Libevent、libev、libuv三個網絡庫,都是c語言實現的異步事件庫Asynchronousevent library。

異步事件庫本質上是提供異步事件通知(Asynchronous Event Notification,AEN)的。異步事件通知機制就是根據發生的事件,調用相應的回調函數進行處理。

  • 事件(Event):事件是異步事件通知機制的核心,比如fd事件、超時事件、信號事件、定時器事件。有時候也稱事件爲事件處理器(EventHandler),這個名稱更形象,因爲Handler本身表示了包含處理所需數據(或數據的地址)和處理的方法(回調函數),更像是面向對象思想中的稱謂。

  • 事件循環(EventLoop):等待並分發事件。事件循環用於管理事件。

對於應用程序來說,這些只是異步事件庫提供的API,封裝了異步事件庫跟操作系統的交互,異步事件庫會選擇一種操作系統提供的機制來實現某一種事件,比如利用Unix/Linux平臺的epoll機制實現網絡IO事件,在同時存在多種機制可以利用時,異步事件庫會採用最優機制。

二、對比三個庫:

  • libevent :名氣最大,應用最廣泛,歷史悠久的跨平臺事件庫;

  • libev :較libevent而言,設計更簡練,性能更好,但對Windows支持不夠好;

  • libuv :開發node的過程中需要一個跨平臺的事件庫,他們首選了libev,但又要支持Windows,故重新封裝了一套,linux下用libev實現,Windows下用IOCP實現;

三、在github上的影響力:

io_lib_github2

可見,目前libuv的影響力最大,其次是libevent,libev關注的人較少。

四、事件種類

在這裏插入圖片描述

這個對比對於libev和libuv更有意義,對於libevent,很多都是跟其設計思想有關的。 libev中的embed很少用,libuv沒有也沒關係;cleanup完全可以用libuv中的async_exit來替代;libuv沒有fork事件。

五、可移植性

三個庫都支持Linux, *BSD, Mac OS X, Solaris, Windows
1574678762767

對於Unix/Linux平臺,沒有什麼大不同,優先選擇epoll,對於windows,libevent、libev都使用select檢測和分發事件(不I/O),libuv在windows下使用IOCP。libevent有一個socket handle, 在windows上使用IOCP進行讀寫。libev沒有類似的。但是libevent的IOCP支持也不是很好(性能不高)。所以如果是在windows平臺下,使用原生的IOCP進行I/O,或者使用libuv。

六、異步架構程序設計原則

1、回調函數不可以執行過長時間,因爲一個loop中可能包含其他事件,尤其是會影響一些準確度要求比較高的timer。
2、儘量採用庫中所緩存的時間,有時候需要根據時間差來執行timeout之類的操作。當然能夠利用庫中的timer最好。

儘量採用庫中所緩存的時間,有時候需要根據時間差來執行timeout之類的操作。當然能夠利用庫中的timer最好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章