47 个版本

0.3.46 2024年7月25日
0.3.45 2024年3月4日
0.3.43 2024年2月28日
0.3.42 2023年3月7日
0.2.0 2017年12月29日

#37并发 分类中

Download history 55/week @ 2024-05-04 110/week @ 2024-05-11 178/week @ 2024-05-18 92/week @ 2024-05-25 58/week @ 2024-06-01 38/week @ 2024-06-08 85/week @ 2024-06-15 85/week @ 2024-06-22 52/week @ 2024-06-29 87/week @ 2024-07-06 52/week @ 2024-07-13 177/week @ 2024-07-20 123/week @ 2024-07-27 42/week @ 2024-08-03 56/week @ 2024-08-10 24/week @ 2024-08-17

每月下载量278次
用于 9 crates

MIT/Apache 许可

600KB
14K SLoC

May

May 是一个高性能库,用于编程栈式协程,可以帮助您轻松开发和维护大规模并发程序。它可以被认为是 Rust 版本的流行 Goroutine


目录


特性

  • 栈式协程实现基于 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根据您的选择采用以下任一许可证

依赖关系

~2–30MB
~432K SLoC