为什么在Node.js CPU绑定代码中使用异步模式?

Gus*_*cco 7 bcrypt node.js async-await

我在NodeJS中使用bcrypt来生成密码哈希.Bcrypt docs说我们可以使用genSalt(),compare()和hash()函数的异步版本.

NodeJS是单线程的,因此理论上如果我使用CPU绑定代码,即使使用异步等待也会阻塞线程.如果我在这种情况下使用async await函数,我的应用程序会发生什么变化?CPU绑定代码在什么情况下会受益于使用异步等待模式?

Chr*_*tos 8

Node.js是单线程的,因为它的主事件循环在单个线程上运行,但这并不意味着它无法在其标准API中使用工作线程来处理I/O和加密等事务(两者都是在单独的线程上工作).

为了编写第三方库,例如bcrypt和其他库,我们能够为Node.js编写C++附加组件,这些附加组件利用libuv提供的线程池,这是支持Node.js中事件循环的库.通过在v10.5中引入Node.js Worker Threads,我们可以编写多线程程序而无需编写任何C++.

查看bcrypt文档,他们提到他们使用线程池来避免阻塞主循环:

如果您在一个简单的脚本上使用bcrypt,使用同步模式是完全正常的.但是,如果在服务器上使用bcrypt,则建议使用异步模式.这是因为bcrypt完成的散列是CPU密集型的,因此同步版本将阻止事件循环并阻止您的应用程序为任何其他入站请求或事件提供服务.异步版本使用不阻止主事件循环的线程池.