#run-time #io-uring #async #fs-file #buffer

已删除 霜冻

基于 iouring 的每个核心一个线程的运行时

0.0.3 2021年10月18日
0.0.2 2021年8月10日
0.0.1 2021年8月10日

#66#fs-file

MIT 协议

320KB
5.5K SLoC

霜冻

具有 io_uring 的每个核心一个线程的运行时。


lib.rs:

Tokio-uring 为 Tokio 运行时提供了一个安全的 io-uring 接口。该库需要 Linux 内核 5.10 或更高版本。

入门

使用 tokio-uring 需要启动一个 tokio-uring 运行时。这个运行时内部管理主要的 Tokio 运行时和一个 io-uring 驱动。

use frosty::fs::File;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    frosty::start(async {
        // Open a file
        let file = File::open("hello.txt").await?;

        let buf = vec![0; 4096];
        // Read some data, the buffer is passed by ownership and
        // submitted to the kernel. When the operation completes,
        // we get the buffer back.
        let (res, buf) = file.read_at(buf, 0).await;
        let n = res?;

        // Display the contents
        println!("{:?}", &buf[..n]);

        Ok(())
    })
}

在底层,frosty::start 启动一个 current-thread 运行时。为了并发,启动多个线程,每个线程都有一个 tokio-uring 运行时。`tokio-uring` 资源类型针对单线程使用进行了优化,大多数都是 !Sync

基于提交的操作

与 Tokio 正式版本不同,io-uring 是基于提交操作的。资源所有权传递给内核,内核然后执行操作。操作完成后,所有权传递回调用者。由于这种差异,`tokio-uring` API 也发生了变化。

例如,在上面的例子中,从 File 读取需要传递缓冲区的所有权。

关闭资源

使用 io-uring,关闭资源(例如文件)是一个异步操作。由于 Rust 还不支持异步丢弃,资源类型提供了一个显式的 close() 函数。如果没有调用 close() 函数,资源在丢弃时仍然会被关闭,但操作将在后台发生。无法保证隐式关闭操作何时发生,因此建议显式调用 close()

依赖项

~1.5–2.7MB
~50K SLoC