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 не буде готове, а потім обчислює її вихідні дані.

This slide should take about 4 minutes.
  • Типи Future та Poll реалізовано саме так, як показано на малюнку; натисніть на лінки, щоб переглянути реалізацію в документації.

  • Ми не будемо переходити до Pin і Context, оскільки ми зосередимося на написанні асинхронного коду, а не на створенні нових асинхронних примітивів. Коротко:

    • Context дозволяє Future запланувати повторне опитування, при настанні певної події.

    • Pin гарантує, що Future не буде переміщено в пам'яті, тому покажчики на цей ф'ючерс залишатимуться дійсними. Це потрібно, щоб дозволити посиланням залишатися дійсними після .await.