3 个不稳定版本
0.2.1 | 2024年3月17日 |
---|---|
0.2.0 | 2023年8月30日 |
0.1.0 | 2023年8月25日 |
在 过程宏 中排名第 1600
每月下载量 99
被 uringy 使用
3KB
Uringy
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