Действительно ли NodeJS однопоточный? - PullRequest
58 голосов
/ 11 августа 2011

Node.js решает проблему «Один поток на соединение», помещая основанную на событиях модель в ее ядро, используя цикл событий вместо потоков. Все дорогостоящие операции ввода-вывода всегда выполняются асинхронно с обратным вызовом, который выполняется после завершения инициированной операции.

Наблюдение, если любая операция происходит, обрабатывается с помощью механизмов мультиплексирования, таких как epoll ().

Мой вопрос сейчас:

  • Почему NodeJS не блокируется при использовании блокирующих системных вызовов выбрать / Epoll / Kqueue?

  • Или NodeJS не является однопоточной вообще, так что второй поток равен
    необходимо соблюдать все операции ввода-вывода с помощью select / epoll / kqueue?

Ответы [ 3 ]

108 голосов
/ 11 августа 2011

NodeJS - это Evented (2-я строка на сайте ), а не однопоточное.Он внутренне обрабатывает потоки, необходимые для обработки select / epoll / kqueue, без необходимости явно управлять этим пользователем, но это не означает, что в нем нет использования потоков.

8 голосов
/ 28 октября 2015

номер

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

V8 -> Делегированный ввод / вывод ( libuv ) -> Пул потоков -> Многопоточный асинхронный

0 голосов
/ 11 октября 2017

JavaScript является однопоточным, как и модель события. Но стек Node не является однопоточным.

Узел использует двигатель V8 для параллелизма.

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