1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#![stable(feature = "futures_api", since = "1.36.0")]

use crate::marker::Unpin;
use crate::ops;
use crate::pin::Pin;
use crate::task::{Context, Poll};

/// future 表示异步计算。
///
/// future 是一个可能尚未完成计算的值。
/// 这种异步值使得,线程在等待值变为可用时,可以继续执行有用的工作。
///
///
/// # `poll` 方法
///
/// future 的核心方法 `poll` 试图将 future 解析为最终值。
/// 如果值未准备好,则此方法不会阻塞。
/// 取而代之的是,如果有可能通过再次轮询来取得进一步的进展,则计划将当前任务唤醒。
/// 传递给 `poll` 方法的 `context` 可以提供 [`Waker`],它是唤醒当前任务的句柄。
///
/// 当使用 future 时,通常不会直接调用 `poll`,而是 `.await` 该值。
///
/// [`Waker`]: crate::task::Waker
///
///
///
#[doc(notable_trait)]
#[must_use = "futures do nothing unless you `.await` or poll them"]
#[stable(feature = "futures_api", since = "1.36.0")]
#[lang = "future_trait"]
#[rustc_on_unimplemented(label = "`{Self}` is not a future", message = "`{Self}` is not a future")]
pub trait Future {
    /// 完成时产生的值类型。
    #[stable(feature = "futures_api", since = "1.36.0")]
    type Output;

    /// 尝试将 future 解析为最终值,如果该值尚不可用,请注册当前任务以进行唤醒。
    ///
    /// # 返回值
    ///
    /// 该函数返回:
    ///
    /// - [`Poll::Pending`] 如果 future 还没有准备好
    /// - [`Poll::Ready(val)`] 如果成功完成,则返回 future 的结果 `val`。
    ///
    /// future 完成后,客户端不应再次对其进行 `poll`。
    ///
    /// 当 future 尚未准备好时,`poll` 返回 `Poll::Pending` 并存储从当前 [`Context`] 复制的 [`Waker`] 的副本。
    /// future 可以取得进展后,将唤醒该 [`Waker`]。
    /// 例如,等待套接字可读的 future 将在 [`Waker`] 上调用 `.clone()` 并将其存储。
    /// 当信号到达其他地方指示套接字可读时,将调用 [`Waker::wake`],并且唤醒套接字 future 的任务。
    /// 一旦任务被唤醒,它应该尝试再次 `poll` future,这可能会或可能不会产生最终值。
    ///
    /// 请注意,在多次调用 `poll` 时,应仅计划将 [`Context`] 中传递给最新调用的 [`Waker`] 接收唤醒。
    ///
    /// # 运行时特征
    ///
    /// 单独的 Futures 是惰性的; 必须对它们进行主动轮询以取得进展,这意味着每次唤醒当前任务时,它都应主动重新轮询以等待仍对其感兴趣的 futures。
    ///
    /// `poll` 函数不会在紧密循环中重复调用 - 而是仅在 future 指示已准备好进行调用时 (通过调用 `wake()`) 才应调用它。
    /// 如果您熟悉 Unix 上的 `poll(2)` 或 `select(2)` 系统调用,则值得注意的是 futures 通常不会遭受与 "所有唤醒都必须轮询所有事件" 相同的问题; 他们更像 `epoll(4)`。
    ///
    /// `poll` 的实现应努力迅速返回,并且不应阻塞。快速返回可防止不必要地阻塞线程或事件循环。
    /// 如果提前得知对 `poll` 的调用可能要花一点时间,则应将工作卸载到线程池 (或类似的线程) 中,以确保 `poll` 可以快速返回。
    ///
    /// # Panics
    ///
    /// future 完成后 (从 `poll` 返回 `Ready`),再次调用其 `poll` 方法可能会导致 panic 永久阻塞或引起其他类型的问题。`Future` trait 对这种调用的效果没有任何要求。
    /// 但是,由于 `poll` 方法未标记为 `unsafe`,因此适用 Rust 的通常规则: 调用绝不能引起未定义的行为 (内存损坏,`unsafe` 函数的错误使用等),而与 future 的状态无关。
    ///
    ///
    /// [`Poll::Ready(val)`]: Poll::Ready
    /// [`Waker`]: crate::task::Waker
    /// [`Waker::wake`]: crate::task::Waker::wake
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    ///
    #[lang = "poll"]
    #[stable(feature = "futures_api", since = "1.36.0")]
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

#[stable(feature = "futures_api", since = "1.36.0")]
impl<F: ?Sized + Future + Unpin> Future for &mut F {
    type Output = F::Output;

    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        F::poll(Pin::new(&mut **self), cx)
    }
}

#[stable(feature = "futures_api", since = "1.36.0")]
impl<P> Future for Pin<P>
where
    P: Unpin + ops::DerefMut<Target: Future>,
{
    type Output = <<P as ops::Deref>::Target as Future>::Output;

    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
        Pin::get_mut(self).as_mut().poll(cx)
    }
}