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

时间:2013-06-20 03:42:21

标签: javascript node.js asynchronous

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

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

1 个答案:

答案 0 :(得分:8)

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

如果在没有任何线程支持的情况下实现模块,那么是,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绑定任务运行得更快,或者至少不会通过异步运行来阻止主事件循环。