#coroutine #stackful #stack #control #asymmetric #yield #first-class

nightly no-std coro

堆栈式,一等非对称协程

2 个版本

0.1.1 2024年7月22日
0.1.0 2024年7月15日

#299并发

Download history 87/week @ 2024-07-10 135/week @ 2024-07-17 36/week @ 2024-07-24 2/week @ 2024-07-31

每月 260 次下载

MIT 许可证

51KB
457

coro

Crates.io docs.rs Build status

这个包为 Rust 语言提供堆栈式,一等非对称协程的实现。

协程的一般概念,最早由 M. E. Conway 在其发表的文献中讨论 [CACM 6 (1963), 396–408],它通过允许子例程共享和传递数据和控制来回扩展了子例程的概念。协程通过调用 yield 函数来挂起其程序的执行,该函数将控制权返回给调用者。在协程上调用 resume 方法将在其上次挂起的地方立即恢复其程序的执行。

Rust 语言具有协程的原生支持,但无法从嵌套函数调用内部轻松挂起它们的执行。解决此问题的一种方法是为每个协程维护一个单独的程序堆栈。这种方法需要更多的内存空间,但可以通过采用池化技术来减少对大量分配和释放的需求。

该crate的核心是Coro类型,该类型实现了内置的core::ops::Coroutine特质。这个库最显著的特点是允许协程在没有传递“yielder”对象的情况下返回控制权。(通过仔细对齐协程的程序堆栈,我们可以仅从当前的堆栈指针值中推断出控制记录的位置。)这种方法有一个缺点:编译器不能再证明yield总是从协程中调用。尽管如此,如果这个不变量不成立,函数将引发panic。可能值得注意的是,这种错误的调用检测机制可能会减慢动作,因为它需要在每次控制权转移时更新线程局部变量。经验丰富的程序员可以禁用safe_yield功能以跳过检查,但我们应该指出,这可能会在纯安全代码中导致未定义的行为。我们实现的一个潜在缺点是所有协程的程序堆栈必须[具有相同的大小]。

参见A. L. de Moura和R. Ierusalimschy的论文“重新审视协程”中对“堆栈式”、“一等”和“非对称”的定义,[ACM TOPLAS 31 (2009), 1–31]。

许可证

MIT © Hugo Sanz González

依赖项

~145KB