#javascript #node.js
#javascript #node.js
Вопрос:
Существует цикл событий, который принимает обратные вызовы и выполняет их, когда это необходимо. И если я понимаю, что это цикл событий одного потока, то есть одновременно выполняется один обратный вызов. Я пишу тест
setInterval(() => { console.log('INTERVAL')}, 801);
setInterval(() => { while(true) { }}, 800);
Есть первый, setinterval()
который сначала попадает в цикл событий. Второй setinterval()
(с бесконечным циклом) прибывает вторым. Итак, выполняется один поток while(true)
, и он не может выполняться console.log('INTERVAL')
.
Означает ли это, что если я, например, напишу сервер на NodeJS, то на одной конечной точке будут выполняться непрерывные вычисления, и если один клиент отправляет запрос, другие клиенты должны ждать, пока сервер не обслужит эти длительные вычисления, а затем будет обслуживать других клиентов?
P.S. в c # TPL мы используем задачи, а CLR thread pull создает два потока, и оба из Console.WriteLine("Interval")
и ‘while true’ выполняются параллельно.
Комментарии:
1. каждые 801 миллисекунду консоль будет отображать пример «ИНТЕРВАЛА» jsfiddle.net/t016czrL
2. @Muath но если setInterval с бесконечным циклом будет первым в цикле событий, так что предупреждение никогда не будет отображаться: jsfiddle.net/4vmcwrqg
Ответ №1:
да, сервер зависает, если одна конечная точка выполняет сложные вычисления, и если другая конечная точка запрашивает, она должна ждать. Узел имеет только один цикл событий и ограниченное количество рабочих потоков
Вы не должны блокировать цикл событий. вы не должны выполнять сложные вычисления в node js синхронно или асинхронно.
Пожалуйста, обратитесь к этому для получения дополнительной информации: https://nodejs.org/en/docs/guides/dont-block-the-event-loop
Ответ №2:
Не используйте while(true){}
Используйте это вместо:
setInterval(() => { console.log('INTERVAL1')}, 801);
// change 1000ms with time you need
setInterval(() => { {setInterval(() => { console.log('INTERVAL2')}, 1000) }}, 800);
Комментарии:
1. Это не вопрос о том, что использовать, это вопрос о том, что произойдет, если один клиент на моем сервере Node Js отправит запрос, который будет обрабатываться слишком долго. Будут ли другие клиенты ждать, пока сервер обслужит первого клиента? И почему, тогда, node js называется super backend language?