Futures

Future é um traço, implementado por objetos que representam uma operação que pode ainda não estar completa. Uma future pode ser polled, e poll retorna um 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,
}
}

Uma função async retorna um impl Future. Também é possível (mas pouco comum) implementar Future para seus próprios tipos. Por exemplo, o JoinHandle retornado de tokio::spawn implementa Future para permitir juntar-se a ele.

A palavra-chave .await, aplicada a uma Future, faz com que a função assíncrona atual pause até que essa Future esteja pronta, e então avalia para sua saída.

  • Os tipos Future e Poll sĂŁo implementados exatamente como mostrado; clique nos links para mostrar as implementaçÔes na documentação.

  • NĂŁo chegaremos a Pin e Context, pois nos concentraremos em escrever cĂłdigo async, em vez de construir novas primitivas async. Brevemente:

    • Context permite que uma Future agende-se para ser polled novamente quando um evento ocorre.

    • Pin garante que a Future nĂŁo seja movida na memĂłria, para que os ponteiros para essa future permaneçam vĂĄlidos. Isso Ă© necessĂĄrio para permitir que as referĂȘncias permaneçam vĂĄlidas apĂłs um .await.