async/await
На высоком уровне асинхронный код на Rust очень похож на «обычный» последовательный код:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use futures::executor::block_on;
async fn count_to(count: i32) {
for i in 0..count {
println!("Count is: {i}!");
}
}
async fn async_main(count: i32) {
count_to(count).await;
}
fn main() {
block_on(async_main(10));
}
Ключевые моменты:
-
Обратите внимание, что это упрощённый пример, иллюстрирующий синтаксис. В нём нет длительной операции и никакой настоящей конкурентности!
-
Ключевое слово
async— синтаксический сахар. Компилятор заменяет возвращаемый тип на фьючерс. -
Нельзя сделать
mainасинхронной без дополнительных указаний компилятору о том, как использовать возвращаемый фьючерс. -
Чтобы запустить асинхронный код, нужен исполнитель (executor).
block_onблокирует текущий поток, пока переданный фьючерс не выполнится до конца. -
.awaitасинхронно ждёт завершения другой операции. В отличие отblock_on,.awaitне блокирует текущий поток. -
.awaitможно использовать только внутри функцииasync(или блока async; о них расскажем позже).