【问题标题】:Why use async pattern in Node.js CPU-bound code?为什么在 Node.js CPU 绑定代码中使用异步模式?
【发布时间】:2019-02-07 01:45:48
【问题描述】:

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

NodeJS 是单线程的,所以理论上如果我使用 CPU 绑定的代码,即使使用异步等待也会阻塞线程。如果在这种情况下使用 async await 函数,我的应用程序会发生什么变化?使用 async await 模式会在哪些场景中受益于 CPU 密集型代码?

【问题讨论】:

    标签: node.js async-await bcrypt


    【解决方案1】:

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

    为了编写第 3 方库,例如 bcrypt 等,我们可以为 Node.js 编写 C++ 插件,利用 libuv 提供的线程池,在 Node.js 中支持事件循环的库。并且随着 v10.5 中Node.js Worker Threads 的引入,我们无需编写任何 C++ 就可以编写多线程程序。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多