Rust 的异步模型建立在 Future trait 之上,其核心方法是 poll,返回 Poll::Ready 或 Poll::Pending。由于编译器生成的异步状态机可能包含自引用结构,Pin 被引入以保证被固定的值不会被移动。
一、Future trait 定义
rust
pub trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}Pin<&mut Self> 保证 Future 一旦开始轮询,其内存地址便不再变化,从而允许安全地持有指向自身字段的引用。
二、手写 Future 的注意事项
- 不要在
poll中执行阻塞操作 - 未就绪时需注册
Waker,否则任务将永远不会被唤醒 - 使用
tokio::pin!或Box::pin处理需要固定到堆上的 Future