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