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并发

Download history 81/week @ 2024-04-20 94/week @ 2024-04-27 58/week @ 2024-05-04 105/week @ 2024-05-11 229/week @ 2024-05-18 124/week @ 2024-05-25 89/week @ 2024-06-01 68/week @ 2024-06-08 121/week @ 2024-06-15 116/week @ 2024-06-22 73/week @ 2024-06-29 94/week @ 2024-07-06 72/week @ 2024-07-13 51/week @ 2024-07-20 127/week @ 2024-07-27 45/week @ 2024-08-03

306 每月下载量
10 个 Crates 中使用(通过 may

MIT/Apache

79KB
2K SLoC

May

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


目录


特性

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

依赖项

~185KB