Выбор ответа Middle Event loop и libuv обновлено

Рекурсивный process.nextTick

Вопрос

Что произойдёт с HTTP-сервером, если в обработчике запустить функцию, которая бесконечно вызывает сама себя через process.nextTick?

function spin() { process.nextTick(spin); }
spin();

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Сервер перестанет отвечать: цикл не выйдет из nextTick. Очередь nextTick опустошается целиком, включая задачи, добавленные во время обработки.

Варианты ответа

  1. Сервер перестанет отвечать: цикл не выйдет из nextTickправильный ответ
  2. Процесс упадёт с переполнением стека через пару секунд
  3. Ничего страшного: nextTick асинхронный, сервер ответит
  4. Node выведет предупреждение и пропустит лишние колбэки

Разбор

Очередь nextTick опустошается целиком, включая задачи, добавленные во время обработки. Рекурсия держит очередь непустой, event loop не переходит к фазам, ввод-вывод не обрабатывается. Это называют I/O starvation.

  • «Ничего страшного» неверно: асинхронность здесь не спасает.
  • Переполнения стека нет: каждый вызов идёт с чистого стека.
  • Такой защиты в Node нет. С setImmediate проблемы бы не было: новые immediate уходят на следующий оборот.

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

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

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