Async Rust: от Future до продакшена
О проекте
- Курс основан на оригинальных материалах Rust Training. Лицензии: MIT (код) и CC-BY-4.0 (текст).
- Русский перевод и адаптация выполнены участниками проекта RustTraining-Rus.
- Замечания и исправления присылайте через Issues и Pull Requests репозитория.
Подробное руководство по асинхронному программированию в Rust. В отличие от большинства туториалов по async, которые начинаются с tokio::main и обходят внутреннее устройство стороной, эта книга строит понимание с первых принципов: трейт Future, опрос (polling), конечные автоматы — и только потом переходит к практическим паттернам, выбору рантайма и продакшен-ловушкам.
Для кого эта книга
- Разработчики на Rust, которые уверенно пишут синхронный код, но путаются в async
- Разработчики из C#, Go, Python или JavaScript, которые знают
async/await, но не знают модели Rust - Все, кто натыкался на
Future is not Send,Pin<Box<dyn Future>>или вопрос «почему программа зависла?»
Предварительные требования
Вы должны уверенно владеть:
- Владением, заимствованием и временами жизни (lifetimes)
- Трейтами и обобщёнными типами (включая
impl Trait) - Типом
Result<T, E>и оператором? - Базовой многопоточностью (
std::thread::spawn,Arc,Mutex)
Предыдущий опыт асинхронного Rust не нужен.
Как пользоваться этой книгой
При первом чтении идите по порядку. Части I–III опираются друг на друга. Каждая глава содержит:
| Символ | Значение |
|---|---|
| 🟢 | Начальный уровень — базовое понятие |
| 🟡 | Средний уровень — требует знания предыдущих глав |
| 🔴 | Продвинутый уровень — глубокие внутренние механизмы или продакшен-паттерны |
В каждой главе есть:
- Блок «Что вы узнаете» в начале
- Диаграммы Mermaid для тех, кто лучше воспринимает визуально
- Встроенное упражнение со скрытым решением
- Ключевые выводы, которые суммируют основные идеи
- Перекрёстные ссылки на связанные главы
План изучения
| Главы | Тема | Примерное время | Контрольная точка |
|---|---|---|---|
| 1–5 | Как работает async | 6–8 ч | Вы можете объяснить Future, Poll, Pin и то, почему в Rust нет встроенного рантайма |
| 6–10 | Экосистема | 6–8 ч | Вы можете написать фьючи вручную, выбрать рантайм и использовать API tokio |
| 11–13 | Async в продакшене | 6–8 ч | Вы можете писать продакшен-код с потоками, корректной обработкой ошибок и graceful shutdown |
| Итог | Чат-сервер | 4–6 ч | Вы создали реальное асинхронное приложение, объединяющее все концепции |
Общее расчётное время: 22–30 часов
Работа с упражнениями
Каждая содержательная глава содержит встроенное упражнение. Итоговый проект (гл. 17) объединяет всё в одном приложении. Для максимальной пользы:
- Сначала решите упражнение, и только потом раскрывайте решение — именно в процессе борьбы с задачей и происходит обучение
- Набирайте код, а не копируйте его — для синтаксиса Rust важна мышечная память
- Запускайте каждый пример —
cargo new async-exercisesи проверяйте по ходу чтения
Содержание
Часть I: Как работает async
- 1. Почему async в Rust устроен иначе 🟢 — Фундаментальное отличие: в Rust нет встроенного рантайма
- 2. Трейт Future 🟡 —
poll(),Wakerи контракт, на котором всё держится - 3. Как работает poll 🟡 — Конечный автомат опроса и минимальный исполнитель
- 4. Pin и Unpin 🔴 — Зачем самоссылающимся структурам нужен pinning
- 5. Раскрываем конечный автомат 🟢 — Что компилятор на самом деле генерирует из
async fn
Часть II: Экосистема
- 6. Создаём фьючи вручную 🟡 — TimerFuture, Join, Select с нуля
- 7. Исполнители и рантаймы 🟡 — tokio, smol, async-std, embassy — как выбрать
- 8. Глубокое погружение в Tokio 🟡 — Варианты рантайма, spawn, каналы, примитивы синхронизации
- 9. Когда Tokio не подходит 🟡 — LocalSet, FuturesUnordered, дизайн, не привязанный к рантайму
- 10. Async-трейты 🟡 — RPITIT, динамическая диспетчеризация, trait_variant, async-замыкания
Часть III: Async в продакшене
- 11. Потоки и AsyncIterator 🟡 — Асинхронная итерация, AsyncRead/Write, комбинаторы потоков
- 12. Типичные ловушки 🔴 — 9 продакшен-багов и как их избежать
- 13. Продакшен-паттерны 🔴 — Graceful shutdown, обратное давление, middleware Tower
- 14. Async — это оптимизация, а не архитектура 🔴 — Синхронное ядро / асинхронная оболочка, налог на раскраску функций
Приложения
- Итоги и справочная карточка — Таблицы для быстрого поиска и деревья решений
- Итоговый проект: асинхронный чат-сервер — Создайте полноценное асинхронное приложение