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 準備就緒,接著則會計算其輸出內容。
-
Future
和Poll
型別的實作方式完全相同。點選連結即可在文件中查看實作方式。 -
我們不會探討
Pin
和Context
,因為我們會專注於編寫非同步程式碼,而非建立新的非同步基元。簡單來說:-
Context
允許 Future 在事件發生時安排自身再次接受輪詢。 -
Pin
可確保 Future 在記憶體中不被移動,這樣該 Future 的指標仍維持有效。如要允許參照在.await
後持續有效,這麼做就有必要。
-