async/await
На високому рівні асинхронний код Rust дуже схожий на “звичайний” послідовний код:
use futures::executor::block_on;
async fn count_to(count: i32) {
for i in 0..count {
println!("Підрахунок: {i}!");
}
}
async fn async_main(count: i32) {
count_to(count).await;
}
fn main() {
block_on(async_main(10));
}
Ключові моменти:
-
Зауважте, що це спрощений приклад для демонстрації синтаксису. У ньому немає тривалої операції чи реального одночасного виконання!
-
Ключове слово “async” - це синтаксичний цукор. Компілятор замінює тип повернення на ф’ючерс.
-
Ви не можете зробити
mainасинхронним без додаткових інструкцій для компілятора щодо використання повернутого ф’ючерса. -
Вам потрібен виконавець для запуску асинхронного коду.
block_onблокує поточний потік, доки наданий ф’ючерс не завершиться. -
.awaitасинхронно очікує на завершення іншої операції. На відміну відblock_on,.awaitне блокує поточний потік. -
.awaitможна використовувати тільки всередині функціїasync(або блоку; вони будуть представлені пізніше).