Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js中的异步编程是否会加快CPU限制的任务?_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript node.js中的异步编程是否会加快CPU限制的任务?

Javascript node.js中的异步编程是否会加快CPU限制的任务?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,今天早些时候,我回答了一个问题,在我发布的示例中,我在bcrypt节点模块中使用了调用的同步版本。我选择使用调用的同步版本主要是因为我认为它使响应看起来更干净,但我也不认为它会影响性能,因为bcrypt是cpu和内存密集型的,而不是I/O绑定的。据我所知,node几乎像浏览器一样在单个线程上运行所有代码,并且只使用后台线程进行I/O和数据库访问。这让我相信cpu密集型任务本质上仍然会“阻塞”服务器,因为没有其他线程可以将工作卸载到服务器上 对我的回答的评论表明我的假设是错误的,经过一些研究后,我

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


对我的回答的评论表明我的假设是错误的,经过一些研究后,我意识到我对node.js如何处理这类事情并不是很了解node.js中的异步编程是否会加快cpu和内存密集型调用?如果是,它是如何实现的?

这取决于模块的实现方式

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

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

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

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

最初的实现方式很简单,模块不是用javascript编写的,而是用C/C++编写的,并通过其插件API与node.js接口

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


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

“node.js中的异步编程是否加快了CPU和内存密集型调用的速度?”——它假装这样做。就像沙钟一样,当你看操作系统的时候,它会加速操作系统的运行。很好的答案。在查看了源代码之后,发现我推荐的bcrypt模块实际上使用了C/C++代码来进行计算,并且通过异步调用可以加快计算速度。我想我的原始答案上的评论是正确的,您可能最好在默认情况下使用异步调用,并且只在您知道有必要时选择同步调用。