Зачем использовать асинхронный шаблон в коде Node.js, связанном с процессором? - PullRequest
0 голосов
/ 07 февраля 2019

Я использую bcrypt в NodeJS для генерации хэша пароля.Bcrypt docs говорит, что мы можем использовать асинхронную версию функций genSalt (), compare () и hash ().

NodeJS является однопоточным, поэтому теоретически, если я использую код с привязкой к ЦП, он заблокирует потокдаже используя асинхронное ожидание.Что изменится в моем приложении, если я буду использовать функции async await в этом случае?Какой сценарий принесет пользу кодам с привязкой к ЦП от использования шаблона асинхронного ожидания?

1 Ответ

0 голосов
/ 07 февраля 2019

Node.js является однопоточным в том смысле, что его основной цикл обработки событий выполняется в одном потоке, но это не означает, что он не способен использовать рабочие потоки в своем стандартном API для таких вещей, какВвод / вывод и криптография (оба из которых работают в отдельных потоках).

Для написания сторонних библиотек, таких как bcrypt и других, мы можем написать дополнения C ++ для Node.js, которыеиспользовать пул потоков , предоставленный libuv , библиотека, поддерживающая цикл событий в Node.js.А с введением рабочих потоков Node.js в v10.5 мы можем писать многопоточные программы без необходимости писать на C ++.

Глядя на bcryptВ документации они упоминают, что используют пул потоков, чтобы избежать блокировки основного цикла:

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

...