MAY
Rust Stackful Coroutine Library.
May is a high performance stackful coroutine library that can be thought of rust version goroutine. You can use it easily to design and develop massive concurrent programs in Rust.
Features
- Stackful coroutine implementation based on generator
- Support schedule on configurable number of threads for multi-cores
- Support coroutine version local storage(CLS)
- Support efficient network async IO
- Support efficient timer management
- Support standard sync primitives plus semaphore, mpmc channel etc.
- Support cancellation of coroutines
- Support graceful panic handling that will not affect other coroutines
- Support scoped coroutine creation
- Support general select for all the coroutine APIs
- All the coroutine APIs are compatible with std library semantics
- All the coroutine APIs can be safely called in thread context
Usage
/// a naive echo server
extern crate may;
use TcpListener;
use ;
More examples
CPU heavy load examples
IO heavy Bound examples
Performance
Just a simple comparison with the Rust echo server implemented in tokio to get a sense about May
Machine Specs:
- Logical Cores: 4 (4 cores x 1 threads)
- Memory: 4gb ECC DDR3 @ 1600mhz
- Processor: CPU Intel(R) Core(TM) i7-3820QM CPU @ 2.70GHz
- Operating System: Ubuntu VirtualBox guest
Echo server client:
- you can just compile it under this project
tokio echo server
run the server by default with 2 threads in another terminal
==================Benchmarking: 127.0.0.1:8080==================
may echo server
run the server by default with 2 threads in another terminal
==================Benchmarking: 127.0.0.1:8000==================
Caveat
There is a detailed doc that describes MAY's main restrictions.
There are four things you should avoid when writing coroutines:
-
Don't call thread blocking APIs. It will hurt the performance.
-
Don't use Thread Local Storage. Access TLS in coroutine would trigger undefined behavior.
-
Don't run CPU bound tasks for long time
-
Don't exceed the stack. It will trigger undefined behavior.
How to tune stack size
If you need to tune the coroutine stack size, please read here
Notices
-
The spawn APIs would be change to
unsafe
so that apply rust safety rules. This would be available in0.2.0
release. please ref this issue and this issue -
Both stable and nightly rust compiler are supported
-
This crate supports below platforms, for more platform support, please ref generator
- x86_64 Linux
- x86_64 MacOs
- x86_64 Windows
License
May is licensed under either of the following, at your option:
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)