Асинхронность
Future и poll, Waker, Pin / Unpin, раскрытие async fn, безопасность отмены, рантайм.
Тема объясняет асинхронность в Rust снизу вверх: трейт Future, его опрос и исполнитель (executor), который этот опрос выполняет. Вопросы о Future и poll проверяют ленивость future, результат poll, .await вне асинхронного контекста (E0728) и опрос завершённого future; раздел о Waker — кто вызывает poll, чем wake отличается от wake_by_ref и как устроен минимальный цикл исполнителя. Раздел о Pin, Unpin и PhantomPinned разбирает, что обещает закрепление, чем pin! отличается от Box::pin и почему future из async-блока нельзя закрепить через Pin::new. Раздел о раскрытии async fn показывает машину состояний: её размер, захват аргументов и времён жизни, рекурсивную async fn (E0733), охранное значение через точку приостановки и async fn в трейтах вместе с dyn. Раздел о безопасности отмены (cancellation safety) разбирает уничтожение future, select!, timeout и abort. Раздел о стримах вводит трейт Stream как асинхронный итератор: poll_next, метод next из StreamExt, требование Unpin, ленивые адаптеры, timeout, throttle и merge, стрим на канале и условие его конца. Последний раздел посвящён рантайму Tokio: задачам и spawn, требованию Send к future, JoinHandle и блокирующему коду внутри задачи. Тема опирается на многопоточность и умные указатели.
52 вопроса: базовый уровень — 22, средний — 27, углублённый — 3. 7 справок, 3 источника.
Разделы
FutureиpollWakerи исполнительPin,Unpin,PhantomPinned- Как раскрывается
async fn - Безопасность отмены
- Стримы:
StreamиStreamExt - Рантайм: задачи,
spawn, блокирующий код
Предыдущая тема: Многопоточность · Следующая тема: Unsafe, UB, FFI