nodejs не является многопоточным, а однопоточным; nodejs использует однопоточный асинхронный неблокирующий режим. Из-за движка JavaScript приложение nodejs не может использовать многоядерные ресурсы и может использовать его. управляемый событиями и асинхронный метод ввода-вывода для создания однопоточной среды выполнения с высоким уровнем параллелизма.
Операционная среда в этой статье: система Windows 10, nodejs версии 12.19.0, компьютер Dell G3.
Узел является однопоточным и использует однопоточный асинхронный неблокирующий режим.
Из-за движка JavaScript узел по умолчанию является однопоточным, и приложение node.js не может использовать многоядерные ресурсы.
Node.js использует управляемый событиями и асинхронный ввод-вывод для реализации однопоточной среды выполнения с высоким уровнем параллелизма. Однопоточный подход означает, что одновременно можно выполнять только одно действие.
Nodejs реализует асинхронный и неблокирующий режим:
В nodejs на самом деле однопоточным является только выполнение js, а ввод-вывод, очевидно, осуществляется другими потоками.
Поток выполнения js является однопоточным. Пока необходимый ввод-вывод передается в libuv, он немедленно возвращается, чтобы сделать другие вещи, а затем libuv выполняет обратный вызов в указанное время.
Подробно, nodejs сначала вызывает его из кода js в привязках узлов к коду C/C, а затем инкапсулирует в код C/C нечто, называемое «объектом запроса», и передает его в libuv. Некоторые из этих объектов запроса похожи на обратные вызовы функций, которые необходимо выполнить. Просто выполните обратный вызов libuv и реализуйте обратный вызов после выполнения.
Короче говоря, общий процесс асинхронного ввода-вывода выглядит следующим образом.
1. Начать вызов ввода-вывода
Пользователь вызывает основной модуль Node из кода Javascript и передает параметры и функции обратного вызова в основной модуль.
Основной модуль Node инкапсулирует переданные параметры и функции обратного вызова в объект запроса.
Отправьте этот объект запроса в пул потоков ввода-вывода, чтобы дождаться выполнения;
Асинхронный вызов Javascript завершается, и поток Javascript продолжает выполнять последующие операции.
2. Выполнить обратный вызов
После завершения операции ввода-вывода функция обратного вызова, ранее инкапсулированная в объекте запроса, извлекается и выполняется для достижения цели обратного вызова Javascript. (Подробности обратного вызова описаны ниже)
Отсюда видно, что на самом деле мы всегда неправильно понимали один поток Node.js.
Фактически, одиночный поток относится к одному потоку в среде выполнения Javascript, а Node.js не имеет возможности создавать новые потоки при запуске Javascript. Последние фактические операции по-прежнему выполняются в Libuv и его цикле событий. Вот почему Javascript, однопоточный язык, может реализовывать асинхронные операции в Node.js. Эти двое не будут конфликтовать.
Расширьте свои знания:
Обзор многопоточности Node.js
Некоторые люди могут сказать, что, хотя Node.js является однопоточным, он может использовать циклические события (цикл событий) для реализации задач одновременного выполнения. Исследуя его суть, NodeJs на самом деле использует два разных потока: один — основной поток для обработки событий цикла, а другой — некоторые вспомогательные потоки в пуле Worker. Основные функции и взаимоотношения этих двух потоков следующие:
Рекомендуемое обучение: «видеоурок по nodejs»
Выше приведены сведения о том, является ли nodejs многопоточным. Для получения дополнительной информации обратите внимание на другие соответствующие статьи на этом сайте!