В Node js, что происходит, если поступает новый запрос и событие l oop уже занято обработкой запроса? - PullRequest
1 голос
/ 15 марта 2020

У меня есть этот файл с именем index.js:

const express = require('express')
const app = express()
const port = 3000

app.get('/home', (req, res) => {
    res.send('Hello World!')
})

app.get('/route1', (req, res) => {
    var num = 0;
    for(var i=0; i<1000000; i++) {
        num = num+1;
        console.log(num);
    }
    res.send('This is Route1 '+ num)
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Сначала я вызываю конечную точку /route1, а затем сразу конечную точку /home. /route1 имеет for loop и занимает некоторое время, чтобы завершить sh, а затем /home запускается и заканчивается. У меня вопрос: пока приложение было занято обработкой /route1, как обрабатывался запрос к /home, учитывая, что node js однопоточный?

Ответы [ 3 ]

1 голос
/ 15 марта 2020

Входящий запрос будет помещен в очередь в nodejs очереди событий до тех пор, пока nodejs не получит шанс обработать следующее событие (когда ваш обработчик событий выполняется долго).

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

В зависимости от того, как внутренние элементы nodejs работает в сети, входящий запрос может быть помещен в очередь в ОС на некоторое время, а затем перемещен в очередь событий, пока nodejs не получит возможность обработать это событие.

Мой вопрос пока приложение был занят обработкой / route1, как обрабатывался запрос к / home, учитывая, что node js однопоточный?

Имейте в виду, что node.js запускает ваш Javascript как однопоточный (хотя мы теперь у вас есть рабочие потоки , если хотите), но он использует внутренние потоки для управления такими вещами, как файловый ввод-вывод и некоторые другие типы асинхронных операций. Это не нуждается в потоках для организации сети, все же. Это осуществляется с помощью реальных асинхронных интерфейсов из ОС.

0 голосов
/ 18 марта 2020

Узел имеет внутренний пул потоков, из которого назначается поток при отправке запроса на блокировку (io, memeory или network). Если нет, то запрос обрабатывается и отправляется обратно как таковой. Если пул потоков заполнен, запрос ожидает в очереди. Обратитесь к Как вообще Node.js обрабатывает 10 000 одновременных запросов? для более четких ответов.

0 голосов
/ 15 марта 2020

Nodejs имеет событие l oop, а событие l oop позволяет nodejs выполнять неблокирующую операцию ввода-вывода. Каждое событие l oop итерации называется галочкой. Существуют различные фазы события l oop.

Первый - timer phase, поскольку в событии сценария нет таймеров. L oop будет go дальше проверять сценарий ввода-вывода.

  1. Когда вы нажимаете на маршрут /route1, Node JS Веб-сервер внутренне поддерживает пул ограниченных потоков для предоставления услуг клиентским запросам. Он будет помещен в очередь FIFO, а затем событие l oop будет go дальше до polling phase.

  2. Фаза опроса будет ожидать ожидающего ввода-вывода, который является маршрутом /route1. Даже L oop проверяет, что любой клиентский запрос помещен в очередь событий. Если нет, то ждите входящие запросы неопределенно долго.

  3. Между тем следующий скрипт ввода-вывода поступает в очередь FIFO, которая является маршрутом /home.

FIFO означает «первым пришел - первым вышел». Поэтому сначала /route1 получит выполнить маршрут /home

Ниже вы можете увидеть это на диаграмме.

enter image description here

A * Приложение 1054 * выполняется в одном потоке, и событие l oop также выполняется в том же потоке

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

Подробнее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...