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

今天早些时候,我回答了这个答案的问题。 在我发布的例子中,我在bcrypt节点模块中使用了一个调用的同步版本。 我select使用同步版本的调用主要是因为我认为它使响应看起来更清洁,但我也不认为这会影响性能,因为bcrypt是CPU和内存密集型而不是I / O绑定。 这是我的理解,节点几乎所有的代码在一个单一的线程像浏览器一样,只使用后台线程的事情,如I / O和数据库访问。 这使我相信,CPU密集型任务仍然会“阻塞”服务器,因为没有其他线程可以卸载工作。

对我的回应的一个评论表明,我的假设是错误的,经过一番研究,我意识到我对node.js如何处理这种事情没有太大的把握。 node.js中的asynchronous编程是否会加速cpu和内存密集型调用? 如果是这样,它是如何做到的?

这取决于模块是如何实现的。

如果模块实现时不支持线程,那么是的,CPU绑定处理不能asynchronous完成。 一些函数提供了callback,我的外观asynchronous,但他们真的不是。 他们实际上同步运行并阻止事件循环。 在javascript中的例子是Array.forEach()

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

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

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

原来这样做的方式只是模块不是用javascript编写的,而是用C / C ++编写的,并通过它的插件API与node.js接口。

但是现在,甚至纯JavaScript模块和函数也可以产生线程和/或进程。 Node有一个名为Cluster的实验模块,它build立了一个节点进程的主/从集群。 然后,您的模块或代码可以在工作进程中运行CPU绑定任务,释放主节点进程以处理事件循环。 在npm上也有几个线程模块。 只要searchnpmjs.org上的“线程”。

所以,可以使CPU绑定任务运行得更快,或者至less不会通过asynchronous运行阻塞主事件循环。