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);
emmain
para 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
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 deblock_on
,.await
não bloqueia o thread atual. -
.await
só pode ser usado dentro de uma funçãoasync
(ou bloco; estes são introduzidos mais tarde).