簡單對比 Libevent libev libuv

2022-07-04 05:09:13 字數 2727 閱讀 8989

。非同步事件庫本質上是提供非同步事件通知(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實現;

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

特性libevent

libev

libuv

優先順序啟用的事件組織在優先順序佇列中,各類事

件預設的優先順序是相同的,可以通過設定

事件的優先順序使其優先被處理

也是通過優先順序佇列來管理啟用的時間,

也可以設定事件優先順序

沒有優先順序概念,按照固定的順序訪

問各類事件

事件迴圈    

event_base用於管理事件

啟用的事件組織在優先順序佇列中,各類事件預設的優先順序是相同的,

可以通  過設定事件的優先順序   使其優先被處理

執行緒安全

event_base和loop都不是執行緒安全的,乙個event_base或loop例項只能在使用者的乙個執行緒內訪問(一般是主線程),註冊到event_base或者loop的event都是序列訪問的,即每個執行過程中,會按照優先順序順序訪問已經啟用的事件,執行其**函式。所以在僅使用乙個event_base或loop的情況下,**函式的執行不存在並行關係

type

libevent

libev

libuv

iofd

iofs_event

計時器(mono clock)

timer

timer

timter

計時器(wall clock)

--periodic

--訊號

signal

signal

signal

程序控制

--child

process

檔案stat

--stat

fs_poll

每次迴圈都會執行的idle事件

--idle

idle

迴圈block之前執行

--prepare

prepare

迴圈blcck之後執行

--check

check

巢狀loop

--embed

--fork

--fork

--loop銷毀之前的清理工作

--cleanup

--操作另乙個執行緒中的loop

--async

async

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

stream ( tcp, pipe, tty )

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

三個庫都支援linux, *bsd, mac os x, solaris, windows

type

libevent

libev

libuv

dev/poll (solaris)yy

yevent portsyy

ykqueue (*bsd)yy

yposix selectyy

ywindows selectyy

ywindows iocpyn

ypollyy

yepollyy

y對於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。

Memcache VS Redis 簡單對比

系統業務以純kv的快取為主,資料量大,併發業務量大,memcache比較合適 memcache將所有資料儲存在物理記憶體中,redis則有自己的vm機制,當資料超量時,會引發swap,影響效能 memcache使用多執行緒的模式 主線程監聽,work子執行緒工作 而redis使用單執行緒,難以充分利...

PO DTO的簡單對比

po persistent object 持久化物件,它跟持久層 通常是關係型資料庫 的資料結構形成一一對應的對映關係,如果持久層是關係型資料庫,那麼,資料表中的每個字段 或若干個 就對應po的乙個 或若干個 屬性。dto data transfer object 資料傳輸物件,這個概念 於j2ee...

FPGA ASIC CPU GPU 簡單對比 初識

ai 領域 fpga asic cpu gpu 簡單對比 簡介cpu 處理器 central processing unit,cpu 是一塊超大規模的積體電路,是一台計算機的運算核心 core 和控制核心 control unit 它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。gpu 圖形...