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));
}
This slide should take about 6 minutes.

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).