#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
находится поверх.