23 个版本
0.1.22 | 2024 年 3 月 3 日 |
---|---|
0.1.21 | 2023 年 2 月 23 日 |
0.1.16 | 2023 年 1 月 31 日 |
0.1.10 | 2022 年 12 月 29 日 |
0.1.0 | 2017 年 8 月 6 日 |
#401 在 并发
306 每月下载量
在 10 个 Crates 中使用(通过 may)
79KB
2K SLoC
目录
特性
- 堆栈协程实现基于 generator;
- 支持在可配置的线程数上调度,适用于多核系统;
- 支持局部存储的协程版本(CLS);
- 支持高效的异步网络 I/O;
- 支持高效的定时器管理;
- 支持标准同步原语,如信号量、MPMC 通道等;
- 支持协程的取消;
- 支持优雅地处理恐慌,不会影响其他协程;
- 支持范围协程创建;
- 支持对所有协程 API 的一般选择;
- 所有协程 API 都与标准库语义兼容;
- 所有协程 API 都可以在多线程上下文中安全调用;
- 支持稳定、beta 和夜间通道;
- 支持 x86_64 GNU/Linux、x86_64 Windows、x86_64 macOS、AArch64 GNU/Linux 和 AArch64 macOS。
用法
使用 May 实现的简单 echo 服务器
#[macro_use]
extern crate may;
use may::net::TcpListener;
use std::io::{Read, Write};
fn main() {
let listener = TcpListener::bind("127.0.0.1:8000").unwrap();
while let Ok((mut stream, _)) = listener.accept() {
go!(move || {
let mut buf = vec![0; 1024 * 16]; // alloc in heap!
while let Ok(n) = stream.read(&mut buf) {
if n == 0 {
break;
}
stream.write_all(&buf[0..n]).unwrap();
}
});
}
}
更多示例
CPU 高负载示例
I/O 高负载示例
性能
您可以通过 https://tfb-status.techempower.com/ 获取与其他最流行的框架的最新 may_minihttp 比较。
注意事项
有一个详细的 文档,描述了 May 的主要限制。一般来说,在编写使用协程的程序时,应遵循以下四件事
- 不要调用线程阻塞API(这会损害性能);
- 谨慎使用线程局部存储(在协程中访问TLS可能会触发未定义的行为)。
以下模式被认为是不安全的
set_tls(); // Or another coroutine API that would cause scheduling: coroutine::yield_now(); use_tls();
但如果你的代码不关心TLS的先前状态,则是安全的。或者,在设置TLS和使用TLS之间没有协程调度。
- 不要长时间运行CPU密集型任务,但如果你不关心公平性,则没有关系;
- 不要超过协程栈。每个协程栈都有一个保护页面。当栈溢出发生时,将触发段错误。
注意
前三个规则在Rust中使用协作异步库时很常见。即使是基于future的系统也有这些限制。因此,你应该真正关注的是协程栈大小,确保它足够大,以满足你的应用程序。
如何调整堆栈大小
如果你想调整协程栈大小,请查看此文档。
许可
May可根据您的选择使用以下任一许可
- Apache License v2.0.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0);
- The MIT License (LICENSE-MIT 或 http://opensource.org/licenses/MIT).
依赖项
~185KB