Rust 异步编程原理:Future、状态机、Waker 与 Executor
Rust 的 async/await 写起来很像同步代码:调用异步函数、等待结果,然后继续向下执行。但它的底层既不会为每个任务创建一个线程,也不会在 await 时阻塞当前线程。 它真正做的事情是:编译器把异步函数转换成一个可以暂停和恢复的状态机,这个状态机实现 Future;Executor 反复调用 poll 推进状态机,Waker 在资源就绪后通知 Executor 再次调度。 本文从一段普通异步代码出发,逐层解释: async fn 返回的到底是什么; await 为什么能暂停函数; 异步代码和状态机是什么关系; Future::poll、Context 和 Waker 分别负责什么; Executor 与 Reactor 如何配合; 为什么 Rust 异步需要 Pin; Tokio 在这套模型中处于什么位置。 本文定位为 《Rust Tokio Runtime 原理与最佳实践》 的前置教程。建议先理解本文中的 Future::poll、状态机、Waker 和 Executor,再继续阅读 Tokio 的调度器、I/O Driver、任务取消与工程实践。 阅读前准备 读者只需要了解 Rust 的基本语法、所有权、枚举和 trait,不要求提前掌握 Tokio。 文中的普通 Rust 代码可以放入一个空项目中实验: cargo new rust-async-basics cd rust-async-basics 涉及 Tokio 的示例可加入依赖: [dependencies] tokio = { version = "1", features = ["full"] } 学习时建议始终追问三个问题: ...