Выбор ответа Middle Event loop и libuv обновлено
Рекурсивный process.nextTick
Вопрос
Что произойдёт с HTTP-сервером, если в обработчике запустить функцию, которая бесконечно вызывает сама себя через process.nextTick?
function spin() { process.nextTick(spin); }
spin();
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Сервер перестанет отвечать: цикл не выйдет из nextTick. Очередь nextTick опустошается целиком, включая задачи, добавленные во время обработки.
Варианты ответа
- Сервер перестанет отвечать: цикл не выйдет из nextTickправильный ответ
- Процесс упадёт с переполнением стека через пару секунд
- Ничего страшного: nextTick асинхронный, сервер ответит
- Node выведет предупреждение и пропустит лишние колбэки
Разбор
Очередь nextTick опустошается целиком, включая задачи, добавленные во время обработки. Рекурсия держит очередь непустой, event loop не переходит к фазам, ввод-вывод не обрабатывается. Это называют I/O starvation.
- «Ничего страшного» неверно: асинхронность здесь не спасает.
- Переполнения стека нет: каждый вызов идёт с чистого стека.
- Такой защиты в Node нет. С
setImmediateпроблемы бы не было: новые immediate уходят на следующий оборот.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Event loop и libuv»
- Тяжёлый цикл без блокировки event loop
- Код-ревью: что блокирует event loop
- Что блокирует event loop
- Объясни event loop в Node.js
- setImmediate и setTimeout внутри I/O
- setTimeout(0) против setImmediate на верхнем уровне
- Event loop Node и браузера: в чём разница
- Порядок nextTick, промиса и setTimeout