async/await

En general, el código asíncrono de Rust se parece mucho al código secuencial “normal”:

use futures::executor::block_on;

async fn count_to(count: i32) {
    for i in 1..=count {
        println!("Count is: {i}!");
    }
}

async fn async_main(count: i32) {
    count_to(count).await;
}

fn main() {
    block_on(async_main(10));
}

Puntos clave:

  • Ten en cuenta que este es un ejemplo simplificado para mostrar la sintaxis. No hay ninguna operación de larga duración ni concurrencia real.

  • ¿Cuál es el tipo de resultado devuelto de una llamada asíncrona?

    • Consulta el tipo con let future: () = async_main(10); en main .
  • La palabra clave “async” es azúcar sintáctico. El compilador sustituye el tipo de resultado devuelto por un futuro.

  • No se puede hacer que main sea asíncrono sin dar instrucciones adicionales al compilador sobre cómo usar el futuro devuelto.

  • Se necesita un ejecutor para ejecutar el código asíncrono. block_on bloquea el hilo hasta que se complete el futuro proporcionado.

  • .await espera de forma asíncrona la finalización de otra operación. A diferencia de block_on, .await no bloquea el hilo.

  • .await solo se puede usar dentro de una función async (o bloqueo; estos se verán más tarde).