Event loop Node и браузера: в чём разница
Вопрос
Чем event loop в Node.js отличается от event loop в браузере?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Общее: один поток 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 ошибок.
Предыдущий вопрос
process.nextTick и setImmediate
Следующий вопрос
Порядок nextTick, промиса и setTimeout
Термины по теме
Ещё по теме «Event loop и libuv»
- Тяжёлый цикл без блокировки event loop
- Код-ревью: что блокирует event loop
- Что блокирует event loop
- Объясни event loop в Node.js
- setImmediate и setTimeout внутри I/O
- setTimeout(0) против setImmediate на верхнем уровне
- Что такое libuv
- Рекурсивный process.nextTick