Ключевое слово async

Возвращает Future вместо блокировки текущего потока.

Используйте async перед fn, замыканием или блоком, чтобы превратить помеченный код в Future. Таким образом, код не будет выполняться немедленно, а будет вычисляться только когда возвращенный фьючер будет ожидаться через .await.

Мы написали книгу по асинхронному программированию, детально описывающую async/await и компромиссы по сравнению с использованием потоков.

Управление потоком выполнения

Операторы return и ? внутри async-блоков не вызывают возврат из родительской функции; вместо этого они вызывают возврат значения из Future, возвращенного блоком.

Например, следующая Rust-функция вернет 5, в результате чего x получит тип !:

#![allow(unused)]
fn main() {
#[expect(unused_variables)]
fn example() -> i32 {
    let x = {
        return 5;
    };
}
}

В contrast, следующая асинхронная функция присваивает Future<Output = i32> переменной x, и возвращает 5 только когда x ожидается через .await:

#![allow(unused)]
fn main() {
async fn example() -> i32 {
    let x = async {
        return 5;
    };

    x.await
}
}

Код с использованием ? ведет себя аналогично - он вызывает возврат Result из async-блока без влияния на родительскую функцию.

Обратите внимание, что вы не можете использовать break или continue внутри async-блока для влияния на управление циклом в родительской функции.

Управление потоком выполнения в async-блоках дополнительно документировано в книге по асинхронному программированию.

Издания (Editions)

async является ключевым словом начиная с издания 2018 года.

Оно доступно для использования в стабильном Rust начиная с версии 1.39.

В contrast, следующая асинхронная функция присваивает Future<Output = i32> переменной x, и возвращает 5 только когда x ожидается через .await:

#![allow(unused)]
fn main() {
async fn example() -> i32 {
    let x = async {
        return 5;
    };

    x.await
}
}

Код с использованием ? ведет себя аналогично - он вызывает возврат Result из async-блока без влияния на родительскую функцию.

Обратите внимание, что вы не можете использовать break или continue внутри async-блока для влияния на управление циклом в родительской функции.

Управление потоком выполнения в async-блоках дополнительно документировано в книге по асинхронному программированию.

Издания (Editions)

async является ключевым словом начиная с издания 2018 года.

Оно доступно для использования в стабильном Rust начиная с версии 1.39.