libxev是一個跨平台事件循環。 Libxev為非塊IO,計時器,信號,事件等提供了一個統一的事件循環抽象,可用於MACOS,Windows,Linux和WebAssembly(瀏覽器和WASI)。它是用Zig編寫的,但導出了C兼容CAPI(這進一步使其與可以與C API通信的任何語言兼容)。
項目狀態:?不穩定,α-質量。在多個平台之間,功能列表非常好,但是有很多缺少的功能。該項目在現實世界環境中的測試尚未得到很好的測試,並且有許多低調的水果以進行性能優化。在這一點上,我也不承諾任何API兼容性。如果您想準備製作,高質量,廣泛的事件循環實施,請查看Libuv,Libev等。
為什麼要有一個新的活動循環庫?一些原因。第一,我認為Zig缺乏與libuv在功能中相當的廣義事件循環(在這裡,“廣義”是關鍵詞)。第二,我想圍繞io_uring的設計模式構建這樣的庫,甚至在其他OS原始圖中模仿其風格(歸功於這篇很棒的博客文章)。第三,我想要一個活動循環庫,它可以構建為WebAssembly(Wasi和獨立式),並且它並不符合現有庫的API風格的目標,而不會帶來像Emscripten這樣的超重內容。這個圖書館的動機主要是在撓我的癢!
跨平台。 linux( io_uring和epoll ),macos( kqueue ),webAssembly + wasi( poll_oneoff ,螺紋和非線程運行時間)。 (計劃支持Windows支持,並即將推出)
procractor api。工作已提交給Libxev事件循環,並通知呼叫者工作完成,而不是工作準備。
零運行時分配。這有助於使運行時性能更具可預測性,並使Libxev非常適合嵌入式環境。
計時器,TCP,UDP,文件,進程。用於與計時器,TCP/UDP插座,文件,進程等相互作用的高級平台-Nostic API。對於不支持異步IO的平台,將自動安排到線程池。
通用線程池(可選)。您可以創建一個通用線程池,配置其資源利用率,並使用它執行自定義背景任務。某些後端使用線程池來執行沒有可靠的非阻止API的非阻滯任務(例如帶有kqueue的本地文件操作)。可以通過多個線程和事件循環共享線程池以優化資源利用率。
低級和高級API。高級API是平台不可靜止的,但具有一些自以為是的行為和有限的靈活性。建議使用高級API,但低級API始終是可用的逃生艙口。低級API是平台特定的,為Libxev用戶提供了一種機制,可以擠出最高性能。低級API在OS接口上方足夠的抽象,以使其在不犧牲明顯性能的情況下更易於使用。
樹木搖動(Zig)。這是Zig的一個特徵,但基本上有益於Libxev等庫。 Zig僅包括您實際使用的功能調用和功能。如果您不使用特定類型的高級觀察者(例如UDP插座),那麼與該抽象相關的功能根本根本不會匯總到您的最終二進制中。這使Libxev支持可選的“尼斯 - 距離”功能,在某些情況下可能被視為“膨脹”,但最終用戶不必為此付費。
無依賴。除了運行時內置的OS API以外,Libxev沒有其他依賴項。 C庫取決於LIBC。這使得跨編譯非常容易。
我仍然想添加很多缺少的功能:
還有更多...
有足夠的績效改進空間,我想完全清楚我沒有做很多優化工作。儘管如此,性能還是很好。我試圖將許多Libuv基準測試用於使用Libxev API。
在我有更好的環境可以運行的環境之前,我不會發布特定的基準結果。作為一個非常廣泛的概括,與其他主要事件循環相比,使用Libxev使用Libxev會有所放緩。這可能會在逐個功能的基礎上有所不同,如果您能在我有興趣解決的問題中表現出非常差的性能!
下面的示例顯示了使用Zig和C中編寫的相同程序,該程序使用Libxev運行單個5S計時器。這幾乎是愚蠢的,但是只是為了傳達圖書館的整體感覺而不是實際的用例。
| ZIG | c |
const xev = @import ( "xev" );
pub fn main () ! void {
var loop = try xev . Loop . init (.{});
defer loop . deinit ();
const w = try xev . Timer . init ();
defer w . deinit ();
// 5s timer
var c : xev.Completion = undefined ;
w . run ( & loop , & c , 5000 , void , null , & timerCallback );
try loop . run ( .until_done );
}
fn timerCallback (
userdata : ? * void ,
loop : * xev.Loop ,
c : * xev.Completion ,
result : xev . Timer . RunError ! void ,
) xev.CallbackAction {
_ = userdata ;
_ = loop ;
_ = c ;
_ = result catch unreachable ;
return .disarm ;
} | # include < stddef . h >
# include < stdio . h >
# include < xev . h >
xev_cb_action timerCallback ( xev_loop * loop , xev_completion * c , int result , void * userdata ) {
return XEV_DISARM ;
}
int main ( void ) {
xev_loop loop ;
if ( xev_loop_init ( & loop ) != 0 ) {
printf ( "xev_loop_init failure n " );
return 1 ;
}
xev_watcher w ;
if ( xev_timer_init ( & w ) != 0 ) {
printf ( "xev_timer_init failure n " );
return 1 ;
}
xev_completion c ;
xev_timer_run ( & w , & loop , & c , 5000 , NULL , & timerCallback );
xev_loop_run ( & loop , XEV_RUN_UNTIL_DONE );
xev_timer_deinit ( & w );
xev_loop_deinit ( & loop );
return 0 ;
} |
這些說明僅適用於下游用戶。如果您將C API用於libxev,請參見“構建”部分。
該軟件包可與Zig 0.11中引入的ZIG軟件包管理器一起使用。創建一個類似的build.zig.zon文件:
.{
. name = "my-project" ,
. version = "0.0.0" ,
. dependencies = .{
. libxev = .{
. url = "https://github.com/mitchellh/libxev/archive/<git-ref-here>.tar.gz" ,
. hash = "12208070233b17de6be05e32af096a6760682b48598323234824def41789e993432c" ,
},
},
}在您的build.zig中:
const xev = b . dependency ( "libxev" , .{ . target = target , . optimize = optimize });
exe . addModule ( "xev" , xev . module ( "xev" ));?文檔是一個正在進行的工作。 ?
當前,文檔有三種形式可用:人頁,示例和代碼註釋。將來,我計劃以網站形式編寫詳細的指南和API文檔,但目前尚不可用。
男人頁面相對詳細! xev(7)將為您提供整個庫的詳細概述。 xev-zig(7)和xev-c(7)將分別提供曲折和C API的概述。從那裡,可以使用API-Specifc Man頁面,例如xev_loop_init(3) 。這是當前最好的文檔。
有多種瀏覽人頁面的方法。最立即友好的是只需在網絡瀏覽器中的docs/目錄中瀏覽Raw Man頁面源即可。 Man Page源是一種類似Markdown的語法,因此它可以通過GitHub在瀏覽器中呈現。
另一種方法是運行zig build -Dman-pages ,並且該頁面將在zig-out中提供。這需要安裝SCDOC(在大多數軟件包管理器中都可以使用)。構建人頁面後,您可以通過路徑渲染它們:
$ man zig-out/share/man/man7/xev.7
最終的方法是通過您喜歡的軟件包管理器(如果和如果有的話)安裝Libxev,希望將您的男人頁面放入您的男人路徑,以便您可以做man 7 xev 。
examples/文件夾中有一些示例。這些示例在C和Zig中均可使用,您可以判斷哪個是使用文件擴展名。
要構建一個示例,請使用以下內容:
$ zig build -Dexample-name=_basic.zig
...
$ zig-out/bin/example-basic
...
-Dexample-name值應為包括擴展名的文件名。
Zig代碼評論得很好。如果您願意閱讀代碼評論,則可以在其中找到很多見解。源位於src/目錄中。
構建需要每晚安裝最新的Zig。 Libxev沒有其他構建依賴性。
安裝後, zig build install將構建完整的庫,並在zig-out中輸出一個與FHS兼容的目錄。您可以使用--prefix標誌自定義輸出目錄。
Libxev擁有一個大型且增長的測試套件。為當前平台運行測試:
$ zig build test
...這將對當前主機平台的所有支持功能運行所有測試。例如,在Linux上,這將同時運行完整的io_uring和Epoll Test Suite。
您可以通過對測試可執行文件進行交叉編譯,將其複製到目標計算機並執行它來構建和運行其他平台的測試。例如,以下顯示瞭如何跨編譯和從Linux構建MacOS的測試:
$ zig build -Dtarget=aarch64-macos -Dinstall-tests
...
$ file zig-out/bin/xev-test
zig-out/bin/xev-test: Mach-O 64-bit arm64 executableWasi是一個特殊情況。如果您安裝了WASMTIME,則可以對WASI進行測試:
$ zig build test -Dtarget=wasm32-wasi -Dwasmtime
...