node.js - nodejs 异步函数是否使用所有 CPU 内核?
问题描述
如果我使用异步函数或带有回调的函数(如本机 fs 模块、http 等),它们会默认在所有 cpu 内核上运行吗?
或者整个事情将只使用 1 个核心?
解决方案
node.js 中的一些异步操作(例如fs
模块中的文件 I/O)将通过 libuv 中的线程池在 node.js 进程中使用额外的线程。这将取决于您的线程池的大小和操作的类型以及您的主机操作系统将使用多少额外的 CPU。在所有通过同一个磁盘的文件 I/O 上使用多个 CPU 并不一定有助于整体吞吐量,因为无论如何读/写通常都会受到磁盘上读/写磁头位置的瓶颈。
一些异步操作,如网络(如http
模块)本质上是非阻塞和异步的,不会使用线程进行网络连接或触发任何有意义的额外 CPU 使用。
这些都不会在多个线程中运行您自己的 Javascript,因为 Javascript 本身都在一个线程中执行。
要充分利用多个 CPU,您可以:
- 将您自己的一些 Javascript 放入新的 nodejs工作线程中,并通过消息传递回主 node.js 线程。
- 启动您自己的 node.js 子进程以在这些子进程中工作,并使用许多进程间通信选项之一来传达结果。
- 使用 node.js 集群,以便可以在可用队列之间拆分传入请求。这需要确保任何服务器状态在所有集群进程之间都是可共享的(通常存储在所有进程都可以访问的某个数据库中)。这将允许单独的请求使用单独的 CPU - 它不会帮助单个请求使用更多的 CPU。您需要为此使用#1 和/或#2。
推荐阅读
- c# - 损坏的身份验证和会话管理
- javascript - 如何创建 EmberJS 应用并将其粘贴到 Chrome 中
- c# - 使用 Json.Net 对 html 字符串进行 Json 反序列化的问题
- mysql - Mysql提高采样查询速度
- postgresql - 将时间戳与查询中的日期名称相等,并在 PostgreSQL 查询中获取结果集 wrt 日期名称
- r - R:随着时间推移的独特观察的新列(从以前的索引)
- node.js - 错误:时区“gmt+0200”无法识别
- amazon-web-services - “aws dynamodb list-tables”未显示存在的表
- javascript - 如何在 html div 中获取数据值?
- ssl - 在设置颤振项目时,我收到错误消息 Got TLS error trying to find package cupertino_icons at https://pub.dartlang.org