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

时间:2019-02-07 01:45:48

标签: node.js async-await bcrypt

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

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

1 个答案:

答案 0 :(得分:7)

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

要编写bcrypt等第三方库,我们可以使用{{提供的线程池”为Node.js编写C ++附加组件。 3}},该库支持Node.js中的事件循环。随着v10.5中libuv的引入,我们能够编写多线程程序而无需编写任何C ++。

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

  

如果在简单脚本上使用bcrypt,则完全可以使用同步模式。但是,如果在服务器上使用bcrypt,则建议使用异步模式。这是因为bcrypt进行的哈希处理占用大量CPU,因此同步版本将阻止事件循环,并阻止您的应用程序处理任何其他入站请求或事件。 异步版本使用不会阻止主事件循环的线程池。