Должен ли я использовать для цикла асинхронный способ, когда я использую node.js?

Я тестирую с помощью node.js с помощью Express.

Теоретически, если я запускаю что-то очень тяжелое вычисление для цикла for без каких-либо обратных вызовов,

это заблокировано, и другой запрос должен быть проигнорирован.

Но в моем случае обычная "петля"

for(var i=0;i<300000;i++) {
    console.log( i );
}

не создает никаких блоков запросов, а только загружает процессор.

Он принимает и другие запросы.

но почему я должен использовать некоторые другие методы, чтобы сделать эти неблокирующие, такие как

process.nextTick()

Или node.js позаботится об основных функциях цикла (for, while) с обертыванием их с помощью process.nextTick() по умолчанию?

2 ответа

Решение

Узел выполняется в одном потоке с циклом событий, поэтому, как вы сказали, когда выполняется цикл for, никакой другой обработки не произойдет. Сокет TCP базовой операционной системы вполне может принимать входящие соединения, но если узел занят выполнением вашей логики зацикливания, сам запрос не будет обрабатываться до тех пор, пока не будет выполнен.

Если вам абсолютно необходимо запустить какой-нибудь длительный процесс в Node, то вы должны использовать отдельные рабочие процессы для выполнения вычислений и оставить основной цикл обработки событий для обработки запросов.

Узел не оборачивает петли process.nextTick(),

Возможно, ваша программа продолжает принимать новые подключения, потому что console.log возвращает управление обратно в главный цикл событий; так как это операция ввода / вывода.

Другие вопросы по тегам