#aio #linux #linux-kernel #future #async #non-blocking #file-io

tokio-linux-aio

为 Linux 内核 AIO 提供的 Tokio 绑定

12 个版本

使用旧的 Rust 2015

0.1.11 2018 年 8 月 30 日
0.1.10 2018 年 8 月 15 日
0.1.9 2018 年 3 月 8 日
0.1.2 2018 年 2 月 24 日

#636 in Unix API

Download history 12/week @ 2024-06-30 45/week @ 2024-07-28

56 monthly downloads

MIT 许可证

68KB
1K SLoC

tokio-linux-aio

Version License Docs Build Status Join the chat at https://gitter.im/tokio-linux-aio/Lobby

此包将 Linux 内核级别的异步 I/O 集成到 Tokio 平台

Linux 内核级别的异步 I/O 与 Posix AIO 库 不同。Posix AIO 是通过用户空间线程池实现的,它调用常规的阻塞系统调用来执行文件 I/O。另一方面,Linux 内核级别的 AIO 提供了对底层块设备的 I/O 操作的内核级异步调度。

注意:实现和测试开发仍在进行中。在对此 crate 进行下一版本修订之前,我正在等待 tokio 0.2 稳定。在此期间,我正在开发 vervolg,它是 SQL 语言子集的前端实现。总的来说,我的目标是构建一个数据库内核的测试平台和实验平台。

用法

将此添加到您的 Cargo.toml

[dependencies]
tokio-linux-aio = "0.1"

然后,将此添加到 crate 的根模块中

extern crate tokio_linux_aio;

示例

一旦您将 crate 添加到项目中,您应该能够编写类似以下内容

// Let's use a standard thread pool
let pool = futures_cpupool::CpuPool::new(5);

// These are handle objects for memory regions
let buffer = MemoryHandle::new();

{
    // Here we go: create an execution context, which uses the pool for background work
    let context = AioContext::new(&pool, 10).unwrap();

    // Create a future to read from a given file (fd) at the given offset into our buffer
    let read_future = context
        .read(fd, 0, buffer)
        .map(move |result_buffer| {
            // do something upon successfully reading the data
            assert!(validate_block(result_buffer.as_ref()));
        })
        .map_err(|err| {
            // do something else when things go wrong
            panic!("{:?}", err);
        });

    // Execute the future and wait for its completion
    let cpu_future = pool.spawn(read_future);
    let result = cpu_future.wait();

    // Should be OK
    assert!(result.is_ok());
}

许可证

此代码受 MIT 许可证 保护。

依赖项

~4.5–6.5MB
~105K SLoC