TGViewer
Rust Rust @rust_lib · 2.24K subscribers
Post #321 1.33K
⏰ Хватит дергать: Waker и паттерн пейджера

Окей, Future вернула управление (сказала Poll::Pending). Но как рантайм узнает, что данные по сети пришли и пора снова вызвать poll()? Если он будет постоянно опрашивать все Future в цикле (while loop), ваш CPU улетит в космос на 100% загрузке.

Здесь на сцену выходят Executor, Reactor и Waker.

• Executor - это менеджер задач. Он берет Future и вызывает у нее poll().
• Reactor - это слушатель ОС (обертка над epoll в Linux, kqueue в macOS или IOCP в Windows). Он ждет событий от сетевой карты или диска.
• Waker - это тот самый пейджер, который выдают в бургерной.

Как это работает:

1. Future делает сетевой запрос и понимает, что данных еще нет.

2. Она регистрирует этот запрос в Reactor и отдает ему свой Waker (колбэк, в котором зашит ID этой Future).

3. Future возвращает Pending. Executor забывает про неё и идет выполнять другие задачи.

4. ...проходит время... Сетевая карта получает пакеты. ОС дергает epoll.

5. Reactor видит: "Ага, пришли данные для сокета X". Он берет Waker, привязанный к этому сокету, и вызывает waker.wake().

6. Waker сигнализирует Executor'у: "Задача #42 готова, помести её обратно в очередь на выполнение".

7. Executor снова вызывает poll(), и стейт-машина делает следующий шаг.

Никакого холостого хода CPU. Только чистая событийная архитектура.

#rust #async #waker #tokio #epoll

👉 @rust_lib
  • 👍 12
  • 🔥 4
  • ❤ 2
  • 🥰 2
  • 👨‍💻 1
  • 🤗 1
More from @rust_lib
  1. Sep 24, 2026🥶 Холодный расчет: #[cold] и likely Компилятор Rust (LLVM) очень умный, но иногда мы знае…
  2. Sep 21, 2026🔮 Ты не пройдешь: Магия предсказателя ветвлений Вы когда-нибудь задумывались, почему обра…
  3. Sep 17, 2026🗝 Турбируем HashMap Стандартный std::collections::HashMap в Rust использует алгоритм хэши…
  4. Sep 16, 2026⚡️ Забудь про RefCell для примитивов Вам нужно изменить поле внутри неизменяемой структуры…
  5. Sep 15, 2026Создание кроссплатформенного приложения с GUI на Rust: От идеи до реальности Electron-прил…
  6. Sep 11, 2026Почему Vec::new() это ловушка для производительности. 📈 Векторный рост: Избегаем реаллока…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →