Часть 1: Руководство по асинхронному программированию в Rust
Эта часть книги представляет собой руководство по асинхронному Rust в стиле учебника. Она предназначена для новичков в асинхронном программировании на Rust. Она будет полезна независимо от того, занимались ли вы асинхронным программированием на других языках или нет. Если да, вы можете пропустить первый раздел или пробежать его глазами для освежения памяти. Вам также, возможно, стоит поскорее прочитать сравнение с async в других языках.
Основные концепции
Мы начнём с обсуждения различных моделей параллельного программирования, использующих процессы, потоки или асинхронные задачи. Первая глава охватит основные части асинхронной модели Rust, прежде чем мы углубимся в детали асинхронного программирования в второй главе, где мы представим парадигму программирования async/await. Мы рассмотрим ещё несколько концепций асинхронного программирования в следующей главе.
Одной из основных причин использования асинхронного программирования является более производительный ввод-вывод (IO), который мы рассматриваем в следующей главе. Мы также подробно рассматриваем блокировки в той же главе. Блокировка — это серьёзная опасность в асинхронном программировании, когда поток лишается возможности прогрессировать из-за операции (часто ввода-вывода), которая синхронно ожидает.
Другой мотивацией для асинхронного программирования является то, что оно способствует новым моделям абстракции и композиции параллельного кода. После этого мы переходим к синхронизации между параллельными задачами.
Также есть глава, посвящённая инструментам для асинхронного программирования.
Последние несколько глав охватывают более специализированные темы, начиная с асинхронного разрушения и очистки (что является распространённым требованием, но, поскольку в настоящее время нет хорошего встроенного решения, это несколько специализированная тема).
Следующие две главы руководства подробно рассматривают фьючерсы (futures) и среды выполнения (runtimes) — два фундаментальных строительных блока асинхронного программирования.
Наконец, мы рассматриваем таймеры и обработку сигналов, а также асинхронные итераторы (async iterators), также известные как потоки (streams). Последние — это то, как мы программируем работы с последовательностями асинхронных событий (в отличие от отдельных асинхронных событий, которые представлены с помощью фьючерсов или асинхронных функций). Это область, в которой язык активно развивается, и поэтому здесь могут быть некоторые шероховатости.