Подтвердить что ты не робот

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

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

Ваша помощь очень ценится. Благодаря

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Libuv: Библиотека для обработки асинхронных операций ввода-вывода.

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

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

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

Ответ 3

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