主要观点:通过滥用 Rust 的语言特性,将async/await
语法反编译为状态机,实现了 sans I/O API 设计模式,可用于编写各种状态机,如用于实现 sans I/O 网络协议 API 的状态机。
关键信息:
- Rust 的
Futures
工作原理,async/await
语法可反编译为状态机。 - 介绍 sans I/O API 设计模式,源于 Python 生态,将 I/O 从核心协议层移除。
- 以 9p 协议为例,展示同步和异步读取 9p 值的代码,以及实现
NinepAvecIO
trait 的过程。 - 提出 sans I/O 方案,将 I/O 操作从协议代码中分离,以实现代码复用,但遇到处理多个 I/O 操作的问题。
- 引入状态机来解决 sans I/O 中的问题,展示了实现状态机的代码,但代码变得冗长难以维护。
- 受 Python 中生成器函数的启发,利用 Rust 的
async/await
和Waker
实现类似的机制,用于在状态机和 I/O 循环之间传递数据。 - 介绍
crimes
crate,提供了围绕上述可疑黑客行为的类型安全 API,实现了支持阻塞和非阻塞 I/O 的 sans I/O API。
重要细节:
- 详细展示了实现各种数据类型(如
u16
、String
)的NinepAvecIO
trait 的代码。 - 阐述了同步和异步版本的
NinepAvecNonBlockingIO
trait 的实现。 - 说明了在 sans I/O 方案中,如何通过
NinepSansIO
trait 分离 I/O 相关的代码。 - 展示了使用状态机实现复杂协议(如 9p 的
create
T-message)的代码。 - 详细介绍了利用
Waker
实现数据传递的 Rust 代码示例,包括SneakyFuture
和ReallySneakyFuture
。 - 给出了使用
crimes
crate 实现 9p 消息读取的代码示例,包括同步和异步版本。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。