Futures

Future 是一种 trait,由表示尚未完成的操作的对象所实现。可以轮询 Future,并且 poll 会返回 一个 Poll 对象。

  1. #![allow(unused)]
  2. fn main() {
  3. use std::pin::Pin;
  4. use std::task::Context;
  5. pub trait Future {
  6. type Output;
  7. fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
  8. }
  9. pub enum Poll<T> {
  10. Ready(T),
  11. Pending,
  12. }
  13. }

异步函数会返回 impl Future。对于自定义的类型,也可以实现 Future(但不常见)。例如,从 tokio::spawn 返回的 JoinHandle 会实现 Future,以允许加入该任务。

在 Future 中使用 .await 关键字会导致当前异步函数暂停,直到该 Future 准备就绪,然后计算其输出。

  • FuturePoll 类型的实现完全如下所示:请点击链接查看文档中的实现。

  • 我们的重点在于编写异步代码,而不是构建新的异步基元,因此不会涉及 PinContext。简言之:

    • 通过 Context,Future 在事件发生时可自行安排重新进行轮询。

    • Pin 确保 Future 不会移到内存中,以便指向该 Future 的指针仍然有效。为了确保使用 .await 之后引用依然有效,必须执行此操作。