0Pricing
Learn Rust Coding · Урок

Введение в Async/Await

Изучите основы функций `async` и выражений `await` для написания асинхронного неблокирующего кода.

«Введение в Async/Await» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 3 уроков всего.

Зачем нужно асинхронное программирование?

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

Традиционно программы блокируются во время такого ожидания, то есть приостанавливают все остальные операции до завершения задачи. Из-за этого приложения могут работать медленно и переставать отвечать.

Когда код ждёт...

Рассмотрим простой пример блокирующей операции. Программа приостановится на 2 секунды перед выводом второго сообщения.

Попробуйте запустить её:

use std::thread;
use std::time::Duration;

fn main() {
  println!("Starting a blocking task...");
  thread::sleep(Duration::from_secs(2)); // This blocks!
  println!("Blocking task finished!");
}

Цена ожидания

В предыдущем примере ожидала вся программа. Если бы это был веб-сервер, это означало бы, что пока запрос одного пользователя ожидает ответа базы данных, сервер не может обслуживать других пользователей!

Асинхронное программирование позволяет программе запустить длительную задачу, а затем перейти к другой работе вместо ожидания. Когда длительная задача будет готова, программа сможет продолжить её выполнение.

Асинхронный подход Rust

Rust предоставляет мощные языковые возможности для асинхронного программирования: ключевые слова async и await.

  • Функции async — это специальные функции, выполнение которых можно приостанавливать и возобновлять.
  • .await используется внутри функции async, чтобы дождаться завершения другой асинхронной задачи, не блокируя всю программу.

Определение функций `async`

Асинхронная функция объявляется добавлением ключевого слова async перед fn. Функция async всегда возвращает Future.

Future — это значение, которое может быть ещё не готово. Оно представляет вычисление, которое в итоге выдаст результат.

async fn my_async_task() -> u32 {
  // This task will eventually return 42
  42
}

Приостановка с помощью `.await`

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

  • приостанавливает собственное выполнение;
  • позволяет программе выполнять другую работу;
  • возобновляет выполнение, когда ожидаемый Future готов.

Это похоже на нажатие кнопки паузы для текущей задачи, пока завершается другая.

Запуск асинхронного кода: исполнители

Функция async возвращает Future, но код внутри неё не выполняется немедленно. Future работают лениво.

Чтобы действительно запустить функцию async и выполнить её Future, нужен исполнитель. В простых примерах можно использовать futures::executor::block_on, который выполняет Future до завершения в текущем потоке.

Ваша первая программа с `async`/`await`

Вот как вместе работают async, await и простой исполнитель. Обратите внимание: block_on используется в main для запуска асинхронного процесса.

Этот пример имитирует асинхронную задержку без блокировки потока функции main — концептуально: сам block_on блокируется до готовности future, но асинхронная задача при этом уступает управление.

use futures::executor::block_on;
use std::time::Duration;

async fn learn_and_wait() {
  println!("Learning asynchronously...");
  // Simulate an async operation that takes time
  // In a real app, this would be an I/O op
  tokio::time::sleep(Duration::from_secs(1)).await;
  println!("Finished learning!");
}

fn main() {
  println!("Starting main function.");
  block_on(learn_and_wait());
  println!("Main function finished.");
}

Понимание трейта `Future`

Когда вы пишете async fn my_func(), Rust фактически преобразует её в конечный автомат, реализующий трейт Future.

У трейта Future есть один основной метод — poll. Исполнитель многократно вызывает его, чтобы проверить, может ли задача продолжить выполнение. Когда для Future используется .await, он сообщает исполнителю, что нужно проверять другой Future, пока тот не завершится.

Быстрая проверка: основы Async/Await

Вы изучили основы async и await. Давайте проверим, сможете ли вы определить основные роли этих элементов.

Повторение и следующие шаги

Отличная работа! Вы сделали первые шаги в асинхронном программировании на Rust.

  • Мы увидели, что синхронный код блокирует выполнение, заставляя программы ждать.
  • Асинхронный код позволяет задачам выполняться параллельно без блокировки.
  • Ключевое слово async объявляет асинхронную функцию, которая возвращает Future.
  • Ключевое слово .await приостанавливает функцию async, пока Future не будет готов.
  • Для запуска Future нужен исполнитель, например block_on.

Далее мы подробно рассмотрим Tokio — мощную среду выполнения и экосистему для создания практических асинхронных приложений на Rust!

Часто задаваемые вопросы

Урок «Введение в Async/Await» бесплатный?

Да — полный текст урока «Введение в Async/Await» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 3 уроков всего.

Чему я научусь в уроке «Введение в Async/Await»?

Изучите основы функций `async` и выражений `await` для написания асинхронного неблокирующего кода. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Введение в Async/Await»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Введение в Async/Await
  2. Создание асинхронных приложений с Tokio
  3. Работа с будущими и задачами
← Назад к Learn Rust Coding