47 个版本
0.3.46 | 2024年7月25日 |
---|---|
0.3.45 | 2024年3月4日 |
0.3.43 |
|
0.3.42 | 2023年3月7日 |
0.2.0 | 2017年12月29日 |
#37 在 并发 分类中
每月下载量278次
用于 9 crates
600KB
14K SLoC
目录
特性
- 栈式协程实现基于 generator;
- 支持在可配置数量的线程上进行调度,适用于多核系统;
- 支持局部存储的协程版本(CLS);
- 支持高效的异步网络 I/O;
- 支持高效的定时器管理;
- 支持标准同步原语,如信号量、MPMC 通道等;
- 支持协程的取消;
- 支持优雅地处理 panic,不会影响其他协程;
- 支持作用域内协程创建;
- 支持对所有协程 API 的一般选择;
- 所有协程 API 都与标准库语义兼容;
- 所有协程 API 都可以在多线程环境中安全调用;
- 支持稳定、beta 和夜间渠道;
- 支持 x86_64 GNU/Linux、x86_64 Windows、x86_64 macOS、AArch64 GNU/Linux 和 AArch64 macOS。
用法
使用 May 实现的简单回声服务器
#[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();
}
});
}
}
更多示例
计算密集型示例
IO 密集型示例
性能
您可以参考 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中使用协作异步库时很常见。即使使用基于futures的系统也有这些限制。因此,你应该真正关注的是协程栈大小,确保它足够大以适应你的应用程序。
如何调整栈大小
如果你想调整协程栈大小,请参阅此文档。
许可
May根据您的选择采用以下任一许可证
- Apache License v2.0.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0);
- MIT License (LICENSE-MIT 或 http://opensource.org/licenses/MIT).
依赖关系
~2–30MB
~432K SLoC