2 个版本
0.1.1 | 2024年7月22日 |
---|---|
0.1.0 | 2024年7月15日 |
#299 在 并发
每月 260 次下载
51KB
457 行
coro
这个包为 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]。
许可证
依赖项
~145KB