Futures

Future 是一種特徵,物件實作這種特徵時,代表作業或許尚未完成。Future 可供輪詢,而 poll 會傳回 Poll

#![allow(unused)]
fn main() {
use std::pin::Pin;
use std::task::Context;

pub trait Future {
    type Output;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

pub enum Poll<T> {
    Ready(T),
    Pending,
}
}

非同步函式會傳回 impl Future。您也可以為自己的型別實作 Future,但不常見。舉例來說,從 tokio::spawn 傳回的 JoinHandle 會實作 Future,以便允許會合。

套用至 Future 的 .await 關鍵字會暫停目前的非同步函式,直到 Future 準備就緒,接著則會計算其輸出內容。

  • FuturePoll 型別的實作方式完全相同。點選連結即可在文件中查看實作方式。

  • 我們不會探討 PinContext,因為我們會專注於編寫非同步程式碼,而非建立新的非同步基元。簡單來說:

    • Context 允許 Future 在事件發生時安排自身再次接受輪詢。

    • Pin 可確保 Future 在記憶體中不被移動,這樣該 Future 的指標仍維持有效。如要允許參照在 .await 後持續有效,這麼做就有必要。