3 个不稳定版本

0.2.1 2024年3月17日
0.2.0 2023年8月30日
0.1.0 2023年8月25日

过程宏 中排名第 1600

Download history 132/week @ 2024-03-14 19/week @ 2024-03-21 35/week @ 2024-03-28 20/week @ 2024-04-04 3/week @ 2024-04-11 10/week @ 2024-04-18

每月下载量 99
uringy 使用

MIT 许可证

3KB

Uringy

website github crates-io docs-rs license

Rust 中编写并发代码不需要痛苦。Uringy 是一个运行时,它结合了结构化并发、单线程设计和 Linux 的 io_uring。适用于服务器应用程序,从简单的单线程到高度可扩展的每核心线程设计。

目标

简单的 API

  • 熟悉的阻塞语法,与 Rust 标准库紧密相似
  • 避免 async/await 的限制和陷阱
  • 拥有优秀的文档和示例,易于学习
  • 可以以非 Send 和非 'static' 类型启动
  • 无泄漏的纤程层次结构,具有一流的取消支持

性能出色

  • 使用 io_uring 发送非阻塞、批量、零拷贝系统调用
  • 高效的上下文切换,具有合作式多任务处理
  • 无原子调度器,如需则手动并行化

编译速度快

  • 使用 [cargo 特性](#编译时间标志) 仅编译所需内容
  • 最小依赖
  • 最小化宏的使用

快速入门

安装 Rust创建一个新的 cargo 项目

将 uringy 添加为依赖项:cargo add uringy

然后替换 src/main.rs

// No need for async main
#[uringy::start]
fn main() {
    let handle = uringy::fiber::spawn(|| tcp_echo_server(9000)); // No need for async block

    uringy::signals().filter(Signal::is_terminal).next().unwrap();
    uringy::println!("gracefully shutting down");
    handle.cancel(); // Cancellation propagates throughout the entire fiber hierarchy

    // Automatically waits for all fibers to complete
}

// No need for async functions
fn tcp_echo_server(port: u16) {
    let listener = uringy::net::TcpListener::bind(("0.0.0.0", port)).unwrap();
    uringy::println!("listening for TCP connections on port {port}"); // No need for .await
    let mut connections = listener.incoming();
    while let Ok((stream, _)) = connections.next() {
        uringy::fiber::spawn(move || handle_connection(stream));
    }
}

fn handle_connection(tcp: TcpStream) {
    let (mut r, mut w) = stream.split();
    let _ = std::io::copy(&mut r, &mut w); // TcpStream implements std::io's Read and Write
}

使用以下命令运行您的项目:cargo run --release

如果您使用的是 macOS,请使用 Linux 虚拟机 或 docker 容器。如果您使用的是 Windows,请使用 WSL

更多信息,请查看示例目录。

编译时标志

目前没有 cargo 标志。

与其他运行时的比较

std 线程 uringy 纤维 tokio 任务
操作系统支持 全部 Linux 大多数
IO 接口 阻塞 io_uring epoll + 线程池
函数颜色 同步 同步 同步和异步
启动 不适用 27 μs 27.5 μs (3.5 μs 使用当前线程调度器)
spawn 9828 ns 59 ns 907 ns (58ns 使用当前线程调度器)
spawn Send 绑定 是,除非使用 LocalSet
spawn 'static 绑定 是,除非使用作用域 是,除非使用作用域
堆栈大小 虚拟 8MB(可配置),4KB 增量 虚拟 128KB(可配置),4KB 增量 完美尺寸
堆栈限制 可能溢出 可能溢出 不能使用递归
上下文切换 1405 ns 60 ns 1328 ns (308 ns 使用当前线程调度器)
多任务处理 抢占式 协作式 主要协作式
结构化并发 没有保证 父纤维比其子纤维存在时间长 没有保证
运行直到 主线程完成 所有纤维完成 block_on 完成
并行性 自动 手动 自动,除非使用当前线程调度器
用户空间调度器 不适用 最小 工作窃取
取消 使用异构 Unix 信号 一等,自愿 泄漏内存,导致错误

支持的 Rust 版本

MSRV 是 1.75.0(2023 年 12 月发布)。请在终端中运行 rustc --version 检查您的 Rust 版本。

支持的 Linux 内核版本

最低内核版本是 6.1(2022 年 12 月发布)。请在终端中运行 uname -r 检查您的内核版本。

许可

Uringy 在MIT 许可证下授权。这是一个宽容的许可证,基本上意味着您可以做任何想做的事情。

依赖项

~320–780KB
~19K SLoC