1 个不稳定版本
0.0.1 | 2024年6月24日 |
---|
#17 在 #fibers
16KB
220 行
async_as_symmetric_coroutines
帮助在稳定 Rust 中使用 async
代码作为对称协程。这只是我的一个实验,后来变得稍微成熟一些。这种设计在协程需要在线程之间移动时可能具有潜力(例如,用于工作窃取),因为这些在似乎是 Send
时是可能的,而其他协程设计则为每个协程有一个调用栈,这些调用栈不能是 Send
。
示例
use async_as_symmetric_coroutines::{Coroutine, Suspender};
type Input1 = Option<Coroutine<Input2>>;
type Input2 = i32;
async fn coro1(_myself: Coroutine<Input1>, suspend: Suspender<Input1>, input: Input1) {
let coro2 = input.unwrap();
let input = suspend.yield_to(&coro2, 123).await;
assert!(input.is_none());
}
let (coro1, coro1_fut) = Coroutine::with_input(coro1);
let (_coro2, coro2_fut) = Coroutine::new(|myself, suspend| async move {
let input = suspend.yield_to(&coro1, Some(myself.clone())).await;
coro1.resume(None).await;
input.to_string()
});
let t1 = std::thread::spawn(|| pollster::block_on(coro1_fut));
let t2 = std::thread::spawn(|| pollster::block_on(coro2_fut));
let r1 = t1.join().unwrap();
assert_eq!(r1, Ok(()));
let r2 = t2.join().unwrap();
assert_eq!(r2, "123");
请参阅 examples/
和 tests/
以获取更多示例。
依赖项
~255KB