Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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));
}
This slide should take about 6 minutes.

Ключевые моменты:

  • Обратите внимание, что это упрощённый пример, иллюстрирующий синтаксис. В нём нет длительной операции и никакой настоящей конкурентности!

  • Ключевое слово async — синтаксический сахар. Компилятор заменяет возвращаемый тип на фьючерс.

  • Нельзя сделать main асинхронной без дополнительных указаний компилятору о том, как использовать возвращаемый фьючерс.

  • Чтобы запустить асинхронный код, нужен исполнитель (executor). block_on блокирует текущий поток, пока переданный фьючерс не выполнится до конца.

  • .await асинхронно ждёт завершения другой операции. В отличие от block_on, .await не блокирует текущий поток.

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