sminez.dev

主要观点:通过滥用 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/awaitWaker实现类似的机制,用于在状态机和 I/O 循环之间传递数据。
  • 介绍crimes crate,提供了围绕上述可疑黑客行为的类型安全 API,实现了支持阻塞和非阻塞 I/O 的 sans I/O API。

重要细节:

  • 详细展示了实现各种数据类型(如u16String)的NinepAvecIO trait 的代码。
  • 阐述了同步和异步版本的NinepAvecNonBlockingIO trait 的实现。
  • 说明了在 sans I/O 方案中,如何通过NinepSansIO trait 分离 I/O 相关的代码。
  • 展示了使用状态机实现复杂协议(如 9p 的create T-message)的代码。
  • 详细介绍了利用Waker实现数据传递的 Rust 代码示例,包括SneakyFutureReallySneakyFuture
  • 给出了使用crimes crate 实现 9p 消息读取的代码示例,包括同步和异步版本。
阅读 7
0 条评论