node.js中的异步编程是否加速了CPU绑定的任务?

Twe*_*les 7 javascript asynchronous node.js

今天早些时候我用这个答案回答了一个问题.在我发布的示例中,我在bcrypt节点模块中使用了同步版本的调用.我选择使用同步版本的调用主要是因为我认为它使响应看起来更清晰,但我也不认为它会影响性能,因为bcrypt是cpu和内存密集而不是I/O绑定.我的理解是,节点几乎所有代码都运行在像浏览器这样的单个线程上,并且只使用后台线程来处理I/O和数据库访问.这让我相信cpu密集型任务仍将基本上"阻塞"服务器,因为没有其他线程可以将工作卸载到.

对我的回答的评论表明我的假设是错误的,经过一些研究后,我意识到我并没有真正掌握node.js如何处理这类事情.node.js中的异步编程是否会加速cpu和内存密集型调用?如果是这样,它是如何做到的?

sle*_*man 7

这取决于模块的实现方式.

如果在没有任何线程支持的情况下实现模块,那么是,CPU绑定处理不能异步完成.有些函数提供回调,我的外观是异步的,但实际上并非如此.它们实际上是同步运行并阻止事件循环.javascript中的这个例子是Array.forEach().

但是,可以实现模块以在后台线程中进行处理.在这种情况下,它确实是异步的,可以加速CPU绑定任务.至少它释放事件循环以处理传入的请求,而后台线程忙于计算结果.

一个例子是crypto.pbkdf2()节点自己的加密模块中的函数.

但是,当node.js在单个线程中运行时,模块如何在其他线程中执行代码?

这个实现的原始方式只是模块不是用javascript编写的,而是用C/C++编写,并通过它的addons API与node.js连接.

但是现在即使是纯粹的javascript模块和函数也可以产生线程和/或进程.Node有一个名为Cluster的实验模块,用于建立节点进程的主/从集群.然后,您的模块或代码可以在工作进程中运行CPU绑定任务,从而释放主节点进程以处理事件循环.npm还有几个可用的线程模块.只需在npmjs.org上搜索"thread"即可.

因此,可以使CPU绑定任务运行得更快,或者至少不通过异步运行来阻止主事件循环.

  • 很好的答案。查看源代码后,事实证明我推荐的 bcrypt 模块实际上使用 C/C++ 代码来进行计算,并且会通过异步调用加速。我猜我的原始答案的评论者是正确的,默认情况下您最好使用异步调用,并且仅在您知道有必要时才选择同步调用。 (2认同)