Существует два типа операции (вызова) в Nodejs блокирование и неблокирование
неблокирование
Nodejs использовать Libuv для операции неблокирования ввода-вывода. Сетевые, файловые и DNS операции ввода-вывода выполняются асинхронно с помощью Libuv. Nodejs используется следующая схема:
API-интерфейсы асинхронной системы используются Node.js везде, где это возможно, но там, где их нет, пул потоков Libuv используется для создания API-интерфейсов асинхронных узлов на основе API-интерфейсов синхронных систем. Node.js API, использующие пул потоков:
все API-интерфейсы fs, кроме API-интерфейсов средства просмотра файлов и следующие:
явно синхронные асинхронные API-интерфейсы шифрования, такие как crypto.pbkdf2 (), crypto.scrypt (), crypto.randomBytes (), crypto.randomFill (), crypto.generateKeyPair ()
dns. lookup () все API zlib *, кроме явно синхронных.
Так что у нас нет прямого доступа к пулу потоков Libuv. Мы можем определить наше собственное использование пула потоков с помощью C ++ дополнений.
Блокировка вызовов
Nodejs выполнить код блокировки в Основная тема. fs.readfileSync()
, алгоритм сжатия, шифрование данных, изменение размера изображения, вычисление простых чисел для большого диапазона - вот некоторые примеры операции блокировки. Nodejs золотое правило никогда не блокирует событие-l oop (основной поток). Мы можем выполнить эти операции асинхронно, создав дочерний процесс, используя модуль cluster
или модуль child-process
. Но создание дочернего процесса является тяжелой задачей с точки зрения ресурсов ОС, и поэтому worker-thread
родился.
Используя worker-thread
, вы можете выполнить блокировку кода javascript в рабочем потоке, следовательно, разблокировать основной поток и вы можете общаться с родительским потоком (основной поток) через передачу сообщений. Рабочие нити по-прежнему легки по сравнению с дочерним процессом.
Подробнее читайте здесь:
https://nodesource.com/blog/worker-threads-nodejs
https://blog.insiderattack.net/deep-dive-into-worker-threads-in-node-js-e75e10546b11