async/await

На високому рівні асинхронний код Rust дуже схожий на "звичайний" послідовний код:

use futures::executor::block_on;

async fn count_to(count: i32) {
    for i in 1..=count {
        println!("Підрахунок: {i}!");
    }
}

async fn async_main(count: i32) {
    count_to(count).await;
}

fn main() {
    block_on(async_main(10));
}
This slide should take about 6 minutes.

Ключові моменти:

  • Зауважте, що це спрощений приклад для демонстрації синтаксису. У ньому немає тривалої операції чи реального одночасного виконання!

  • Який тип повернення асинхронного виклику?

    • Використовуйте let future: () = async_main(10); в main, щоб побачити тип.
  • Ключове слово "async" - це синтаксичний цукор. Компілятор замінює тип повернення на ф'ючерс.

  • Ви не можете зробити main асинхронним без додаткових інструкцій для компілятора щодо використання повернутого ф'ючерса.

  • Вам потрібен виконавець для запуску асинхронного коду. block_on блокує поточний потік, доки наданий ф'ючерс не завершиться.

  • .await асинхронно очікує на завершення іншої операції. На відміну від block_on, .await не блокує поточний потік.

  • .await можна використовувати тільки всередині функції async (або блоку; вони будуть представлені пізніше).