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);emmainpara ver o tipo.
- Use
-
A palavra-chave “async” é açúcar sintático. O compilador substitui o tipo de retorno por uma future.
-
Você não pode tornar
mainasync, sem instruções adicionais para o compilador sobre como usar a future retornada. -
Você precisa de um executor para executar código async.
block_onbloqueia o thread atual até que a future fornecida tenha sido executada até a conclusão. -
.awaitespera assincronamente pela conclusão de outra operação. Ao contrário deblock_on,.awaitnão bloqueia o thread atual. -
.awaitsó pode ser usado dentro de uma funçãoasync(ou bloco; estes são introduzidos mais tarde).