Введение в 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 — локальная установка не требуется.
Все уроки этого курса
- Введение в Async/Await
- Создание асинхронных приложений с Tokio
- Работа с будущими и задачами