BorrowCheck › Ядро языка Rust

Асинхронность

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 источника.

Разделы

  1. Future и poll
  2. Waker и исполнитель
  3. Pin, Unpin, PhantomPinned
  4. Как раскрывается async fn
  5. Безопасность отмены
  6. Стримы: Stream и StreamExt
  7. Рантайм: задачи, spawn, блокирующий код

Предыдущая тема: Многопоточность · Следующая тема: Unsafe, UB, FFI