Ответ вслух Senior Event loop и libuv обновлено

Event loop Node и браузера: в чём разница

Вопрос

Чем event loop в Node.js отличается от event loop в браузере?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Модель общая: JavaScript работает в одном потоке, есть задачи и микрозадачи, и после каждой задачи очередь микрозадач выполняется до конца. Разница в устройстве.

Что должно прозвучать в ответе

  • Общее: один поток JS, макрозадачи и микрозадачи, микрозадачи опустошаются после каждой задачи

  • В Node цикл реализует libuv и делится на фазы (timers, poll, check, close)

  • В Node есть process.nextTick и setImmediate, в браузере их нет

  • В браузере есть этап рендеринга и requestAnimationFrame, в Node нет

  • В Node пул потоков для fs/dns/crypto, в браузере аналог это Web Workers по явному запросу

Что могут спросить следом

  • Где в браузере выполняется requestAnimationFrame относительно микрозадач?
  • Зачем Node отдельная очередь nextTick, если есть queueMicrotask?

Разбор

Модель общая: JavaScript работает в одном потоке, есть задачи и микрозадачи, и после каждой задачи очередь микрозадач выполняется до конца.

Разница в устройстве. В браузере цикл описан в стандарте HTML: задачи из разных источников, затем микрозадачи, затем при необходимости шаг рендеринга с requestAnimationFrame, стилями и отрисовкой. В Node цикл даёт libuv, и он разделён на фазы: таймеры, poll для ввода-вывода, check для setImmediate, close. В Node есть свои механизмы: process.nextTick, который идёт даже раньше промисов, и setImmediate. Рендеринга нет вовсе.

Ещё отличие: Node незаметно для кода использует пул потоков для файлов, DNS и криптографии, а в браузере параллельность появляется только когда разработчик сам создаёт Web Worker.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме