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

Является ли NodeJS действительно однопоточным?

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

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

Мой вопрос:

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

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

4b9b3361

Ответ 1

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

Ответ 2

Нет.

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

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

Ответ 3

JavaScript - однопоточный, так что это event-модель. Но Node стек не является однопоточным.

Node использует двигатель V8 для concurrency.