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 準備就緒,接著則會計算其輸出內容。

Speaker Notes

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

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

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

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