async/await

De maneira geral, o código async do Rust se parece muito com o código sequencial “normal”:

use futures::executor::block_on;

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

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

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

Pontos chave:

  • Observe que este Ă© um exemplo simplificado para mostrar a sintaxe. NĂŁo hĂĄ operação de longa duração ou qualquer concorrĂȘncia real nele!

  • Qual Ă© o tipo de retorno de uma chamada async?

    • Use let future: () = async_main(10); em main para ver o tipo.
  • A palavra-chave “async” Ă© açĂșcar sintĂĄtico. O compilador substitui o tipo de retorno por uma future.

  • VocĂȘ nĂŁo pode tornar main async, sem instruçÔes adicionais para o compilador sobre como usar a future retornada.

  • VocĂȘ precisa de um executor para executar cĂłdigo async. block_on bloqueia o thread atual atĂ© que a future fornecida tenha sido executada atĂ© a conclusĂŁo.

  • .await espera assincronamente pela conclusĂŁo de outra operação. Ao contrĂĄrio de block_on, .await nĂŁo bloqueia o thread atual.

  • .await sĂł pode ser usado dentro de uma função async (ou bloco; estes sĂŁo introduzidos mais tarde).