#coroutine #async #generator #future #fiber #fibers

async_as_symmetric_coroutines

帮助在稳定 Rust 中使用 async 代码作为对称协程

1 个不稳定版本

0.0.1 2024年6月24日

#17#fibers

Unlicense

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