请解释 Rust 中异步编程的运作机制,并详细阐述 async/await 的底层实现原理。
考察说明
考察对 Rust 异步编程模型及 async/await 底层机制的理解。
回答思路
- 【回答框架 1】Rust 异步编程基于状态机和事件循环。async 函数会被编译为状态机,每个 await 点对应一个状态,由编译器生成 Future 实现。
- 【回答框架 2】Future 是惰性的,只有在 poll 时才会推进。运行时(如 tokio)负责调度和轮询,当 Future 返回 Pending 时,将其挂起,等待事件就绪后再次 poll。
- 【回答框架 3】async/await 本身不提供运行时,只定义语法和 Future 接口。运行时通过 waker 机制通知任务何时可以继续执行。
- 【关键点 1】async 函数编译为状态机,每个 await 生成一个状态。
- 【关键点 2】Future 的 poll 方法驱动执行,返回 Pending 或 Ready。
- 【关键点 3】运行时(如 tokio)通过任务调度和 waker 实现异步执行。
- 【易错点 1】错误地认为 async 函数会自动并发执行,必须由运行时调度。
- 【易错点 2】忽视 waker 的作用,导致任务挂起后无法恢复。
- 【易错点 3】在 CPU 密集任务中使用 async,可能阻塞执行器。