Как NodeJS обрабатывает так много входящих запросов, использует ли он пул потоков?

#multithreading #node.js

#многопоточность #node.js

Вопрос:

Когда запрос поступает на сервер nodejs, как он обрабатывает запрос?

Я понимаю, что у него другой способ обработки запросов, поскольку он не создает новый поток для каждого запроса (или я предполагаю, что он также не использует традиционный пул потоков).

Может кто-нибудь объяснить мне, что происходит под капотом, и имеет ли значение вкус Linux здесь?

Ответ №1:

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

 endless loop {
  event = next_event()
  dispatch_event(event)
}
  

Единственным исключением является файловая система, для этого она использует пул потоков под капотом.

Комментарии:

1. то есть вы имеете в виду, что он на самом деле сериализован? когда запрос находится в «спящем режиме», как он просыпается и сообщает потоку о запуске?

2. @codecompleting: Вы можете попросить ОС уведомлять вас, когда данные поступают в сокет или около того.

3. Было бы какое-нибудь преимущество в том, чтобы сделать NodeJS многопоточным? Или он может в принципе полностью использовать процессор с одним потоком? И могут ли NodeJS использовать несколько ядер?

4. @MikeChristensen: Вы можете создавать несколько процессов с помощью node и использовать при этом все ядра, но node на самом деле не создан для работы с интенсивным использованием процессора. Если вам нужны многопроцессорные веб-серверы или около того, вы можете использовать встроенную функцию «кластера», она позволяет вам запускать столько копий вашей программы, сколько вы хотите, и она будет передавать входящие соединения случайным процессам.

5. Как mamy события может хранить node ja? Где они находятся? Как измерить их количество?

Ответ №2:

Узел сообщает операционной системе (через epoll , kqueue , /dev/poll или select ), что она должна получать уведомления при установлении нового соединения, а затем переходит в спящий режим. Если подключается кто-то новый, он выполняет обратный вызов. Каждое соединение представляет собой лишь небольшое выделение кучи

Он «управляется событиями», где он обрабатывает ввод-вывод асинхронным образом (неблокирующий ввод-вывод). Он внутренне выполняет обработку потоков, необходимую для выполнения epoll , kqueue /dev/poll или select обработки, но для вас как пользователя / клиента это абсолютно прозрачно.

например, epoll на самом деле не пул потоков, а средство уведомления о событиях ввода-вывода операционной системы, которое node.js находится поверх.