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)); }
Ключові моменти:
-
Зауважте, що це спрощений приклад для демонстрації синтаксису. У ньому немає тривалої операції чи реального одночасного виконання!
-
Який тип повернення асинхронного виклику?
- Використовуйте
let future: () = async_main(10);
вmain
, щоб побачити тип.
- Використовуйте
-
Ключове слово "async" - це синтаксичний цукор. Компілятор замінює тип повернення на ф'ючерс.
-
Ви не можете зробити
main
асинхронним без додаткових інструкцій для компілятора щодо використання повернутого ф'ючерса. -
Вам потрібен виконавець для запуску асинхронного коду.
block_on
блокує поточний потік, доки наданий ф'ючерс не завершиться. -
.await
асинхронно очікує на завершення іншої операції. На відміну відblock_on
,.await
не блокує поточний потік. -
.await
можна використовувати тільки всередині функціїasync
(або блоку; вони будуть представлені пізніше).