Как NodeJS разрешают непрерывные операции?

#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?