Node.js является однопоточным в том смысле, что его основной цикл обработки событий выполняется в одном потоке, но это не означает, что он не способен использовать рабочие потоки в своем стандартном API для таких вещей, какВвод / вывод и криптография (оба из которых работают в отдельных потоках).
Для написания сторонних библиотек, таких как bcrypt
и других, мы можем написать дополнения C ++ для Node.js, которыеиспользовать пул потоков , предоставленный libuv , библиотека, поддерживающая цикл событий в Node.js.А с введением рабочих потоков Node.js в v10.5 мы можем писать многопоточные программы без необходимости писать на C ++.
Глядя на bcrypt
В документации они упоминают, что используют пул потоков, чтобы избежать блокировки основного цикла:
Если вы используете bcrypt в простом скрипте, использование режима синхронизации вполне подойдет.Однако, если вы используете bcrypt на сервере, рекомендуется асинхронный режим.Это связано с тем, что хеширование, выполняемое bcrypt, требует значительных ресурсов процессора, поэтому версия синхронизации блокирует цикл обработки событий и не позволяет вашему приложению обслуживать любые другие входящие запросы или события. В асинхронной версии используется пул потоков, который не блокирует основной цикл событий.