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

Speaker Notes

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

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

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

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