#io-uring #tokio #loona #abstraction #io-uring-async #squeue #cqueue

luring

使用 tokio 的 AsyncFd 实现的 io-uring 抽象

1 个不稳定版本

新版本 0.1.0 2024 年 8 月 14 日

#232异步

Download history 126/week @ 2024-08-10

126 每月下载量
用于 buffet

MIT/Apache

16KB
288 代码行

luring

luring 最初是 https://github.com/thomasbarrett/io-uring-async 的分支

它是 loona 的 io_uring 引擎

以下为原始 README

IoUringAsync

IoUringAsync 是一个轻量级的异步兼容层,覆盖了常用的 io-uring 库,使其更容易与 Tokio 运行时一起使用。

类似项目

本项目深受 tokio-uring 项目的启发。与 tokio-uring 不同,IoUringAsync 不是自己的运行时。相反,它是一组轻量级的、大多数与运行时不相关的 future。

限制

目前,本项目不支持多射击 io_uring 操作。

完全控制 SQE 提交。

let sqe = opcode::Write(...).build();
let fut = uring.push(sqe);
uring.submit();
let cqe = fut.await;

示例

use std::rc::Rc;
use io_uring::{squeue, cqueue, opcode};
use io_uring_async::IoUringAsync;
use send_wrapper::SendWrapper;

fn main() {
    let uring = IoUringAsync::new(8).unwrap();
    let uring = Rc::new(uring);

    // Create a new current_thread runtime that submits all outstanding submission queue
    // entries as soon as the executor goes idle.
    let uring_clone = SendWrapper::new(uring.clone());
    let runtime = tokio::runtime::Builder::new_current_thread().
        on_thread_park(move || { uring_clone.submit().unwrap(); }).
        enable_all().
        build().unwrap();

    runtime.block_on(async move {
        tokio::task::LocalSet::new().run_until(async {
            // Spawn a task that waits for the io_uring to become readable and handles completion
            // queue entries accordingly.
            tokio::task::spawn_local(IoUringAsync::listen(uring.clone()));

            let cqe = uring.push(Nop::new().build()).await;
            assert!(cqe.result() >= 0, "nop error: {}", cqe.result());
        }).await;
    });
}

依赖项

~3–11MB
~96K SLoC