11 个版本 (7 个破坏性更新)
0.9.0 | 2024年5月24日 |
---|---|
0.8.0 | 2023年8月29日 |
0.7.0 | 2022年4月21日 |
0.6.0 | 2021年9月18日 |
0.1.1 | 2017年7月26日 |
#207 in 异步
2,472 每月下载次数
用于 5 crates
13KB
165 行
mio-aio
一个用于将文件 I/O 与 mio 集成的库,使用 POSIX AIO 和 kqueue。文件 I/O 可以无缝地与同一事件循环中的网络 I/O 和定时器混合。
# Cargo.toml
[dependencies]
mio-aio = "0.7.0"
mio = "0.8.0"
用法
此 crate 的用法基于 mio_aio::AioCb
类型,它是对 nix::AioCb
的包装。您可以使用类似于 nix
提供的构造函数创建一个。注册与任何 mio
类型相同,但 AioCb
必须单独注册。底层文件不会与 mio
注册。一旦注册,您可以使用包装 nix
类型的 read
、write
等方法发出 AioCb
。在 mio
的 poll
方法返回事件后,调用 AioCb::aio_return
以获取最终状态。此时,内核已忘记关于 AioCb
的信息。无需注销它(尽管注销不会造成伤害)。
平台
mio-aio
在 FreeBSD 上运行。它可能在 DragonflyBSD 上也能运行。它不适用于 Linux 或 MacOS。
不幸的是,Linux包含了一个对POSIX AIO的较差实现,它使用用户空间线程在glibc中模拟异步I/O。更糟糕的是,epoll(2)无法为POSIX AIO提供完成通知。这意味着它无法由mio-aio
支持。但Linux用户仍然有希望!Linux有一个非标准的异步文件I/O API,称为libaio。Libaio的性能比Linux的POSIX AIO要好。然而,它仍然无法通过epoll(2)提供完成通知。它所能做的是通过eventfd(2)提供完成通知。而epoll可以轮询eventfd。因此,希望使用mio
与文件进行交互的Linux程序员可以理论上编写一个mio-libaio
crate,该crate使用一个eventfd来轮询所有的libaio操作。然后,他可以在mio
之上实现一个可移植层,例如在tokio
中。
在MacOS上,AIO只支持使用信号进行通知,而不是kqueue。在MacOS上,mio-aio
理论上可以在一个单独的线程中运行aio-suspend
,这将向主线程的reactor发送完成通知。然而,性能会受到影响。
许可证
mio-aio
主要在MIT许可证和Apache许可证(版本2.0)的条款下分发。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。
依赖项
~2–12MB
~86K SLoC