Как работает node.js? - PullRequest
       1

Как работает node.js?

48 голосов
/ 29 февраля 2012

Я не понимаю несколько вещей о nodejs. В каждом источнике информации говорится, что node.js является более масштабируемым, чем стандартные многопоточные веб-серверы, из-за отсутствия блокировки потоков и переключения контекста, но мне интересно, если node.js не использует потоки, как он обрабатывает параллельные запросы параллельно? Что означает модель события ввода / вывода?

Ваша помощь очень ценится. Спасибо

Ответы [ 3 ]

79 голосов
/ 29 февраля 2012

Узел полностью управляется событиями.По сути, сервер состоит из одного потока, обрабатывающего одно событие за другим.

Новый поступающий запрос - это событие одного типа.Сервер начинает обрабатывать его, и когда происходит блокирующая операция ввода-вывода, он не ждет его завершения и вместо этого регистрирует функцию обратного вызова.Затем сервер немедленно начинает обрабатывать другое событие (возможно, другой запрос).Когда операция ввода-вывода завершена, это событие другого типа, и сервер обработает его (т.е. продолжит работу над запросом), выполнив обратный вызов, как только у него будет время.

Таким образом, сервер никогда не нуждаетсясоздавать дополнительные потоки или переключаться между потоками, что означает, что у него очень мало накладных расходовЕсли вы хотите в полной мере использовать несколько аппаратных ядер, вы просто запускаете несколько экземпляров node.js

Обновление На самом низком уровне (код C ++, а не Javascript), тамна самом деле это несколько потоков в node.js: существует пул работников ввода-вывода, задача которых состоит в том, чтобы получать прерывания ввода-вывода и помещать соответствующие события в очередь для обработки основным потоком.Это предотвращает прерывание основного потока.

2 голосов
/ 07 апреля 2019

Node JS - это среда выполнения JavaScript. И браузер, и Node JS работают на движке V8 JavaScript. Node JS использует управляемую событиями неблокирующую модель ввода / вывода, которая делает ее легкой и эффективной. Приложения JS узла используют однопотоковую архитектуру цикла обработки событий для обработки одновременных клиентов. На самом деле его основной цикл обработки событий является однопоточным, но большая часть операций ввода-вывода работает в отдельных потоках, поскольку API-интерфейсы ввода-вывода в Node JS по своей конструкции асинхронны / неблокируют, чтобы приспособить основной цикл событий. Рассмотрим сценарий, в котором мы запрашиваем базу данных базы данных для деталей user1 и user2, а затем печатаем их на экране / консоли. Ответ на этот запрос занимает время, но оба запроса пользовательских данных могут выполняться независимо и одновременно. Когда 100 человек подключаются одновременно, а не имеют разные потоки, Node будет зацикливать эти подключения и запускать любые события, о которых должен знать ваш код. Если соединение новое, оно сообщит вам. Если соединение отправило вам данные, оно сообщит вам. Если соединение ничего не делает, оно пропустит его, вместо того, чтобы занимать на нем точное время ЦП. Все в Node основано на реагировании на эти события. Таким образом, мы можем видеть результат: центральный процессор остается сфокусированным на этом одном процессе и не имеет кучу потоков для внимания. В приложении Node.JS нет буферизации, он просто выводит данные кусками.

1 голос
/ 17 августа 2017

Несмотря на то, что вопрос уже объяснен в течение долгого времени, я думаю о том же самом.

Узел JS - однопоточная технология.В основном, проблема Node JS creator (Ryan Dahl) заключалась в том, что параллельная обработка с использованием нескольких потоков не является правильным или слишком сложным.

если node.js не использует потоки, как он обрабатывает параллельные запросы впараллельный

Ответ: Это совершенно неправильное предложение, когда вы говорите, что не используют потоки, а узлы J используют потоки, но разумно. Он использует один поток для обслуживания всех HTTP-запросов и несколько потоков в пуле потоков (в libuv) для обработки любой операции блокировки

Libuv: Библиотека для обработки асинхронныхI / O.

Что означает модель событийного ввода-вывода?

Ans: Правильный термин неблокирующий ввод-вывод .Это почти никогда не блокирует, как говорит официальный сайт Node JS.Когда какой-либо запрос отправляется на сервер узла, он никогда не ставится в очередь.Он принимает запрос и начинает выполнение, если это блокирующая операция, затем он отправляется в область рабочих потоков и регистрирует обратный вызов для него, как только выполнение кода завершается, он запускает тот же обратный вызов и переходит в очередь событий и снова обрабатывается циклом событий послекоторые создают ответ и отправляют соответствующему клиенту.

Полезная ссылка: нажмите здесь

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