gpt4 book ai didi

javascript - node.js 中的异步编程是否可以加速 CPU 密集型任务?

转载 作者:数据小太阳 更新时间:2023-10-29 04:40:46 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

但是,node.js单线程运行时,模块如何执行其他线程的代码呢?

这个实现的最初方式只是模块不是用 javascript 编写的,而是用 C/C++ 编写的,并通过它的插件 API 连接到 node.js。

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

因此,是的,CPU 密集型任务可以运行得更快,或者至少通过异步运行不会阻塞主事件循环。

关于javascript - node.js 中的异步编程是否可以加速 CPU 密集型任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com