Futures
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
для ваших власних типів. Наприклад, JoinHandle
, отриманий від tokio::spawn
, реалізує Future
, щоб дозволити приєднання до нього.
Ключове слово .await
, застосоване до Future
, змушує поточну асинхронну функцію призупинятися, доки це Future
не буде готове, а потім обчислює її вихідні дані.
-
Типи
Future
таPoll
реалізовано саме так, як показано на малюнку; натисніть на лінки, щоб переглянути реалізацію в документації. -
Ми не будемо переходити до
Pin
іContext
, оскільки ми зосередимося на написанні асинхронного коду, а не на створенні нових асинхронних примітивів. Коротко:-
Context
дозволяє Future запланувати повторне опитування, при настанні певної події. -
Pin
гарантує, що Future не буде переміщено в пам'яті, тому покажчики на цей ф'ючерс залишатимуться дійсними. Це потрібно, щоб дозволити посиланням залишатися дійсними після.await
.
-