首页 > 解决方案 > nodejs 异步函数是否使用所有 CPU 内核?

问题描述

如果我使用异步函数或带有回调的函数(如本机 fs 模块、http 等),它们会默认在所有 cpu 内核上运行吗?

或者整个事情将只使用 1 个核心?

标签: node.jsservercpu

解决方案


node.js 中的一些异步操作(例如fs模块中的文件 I/O)将通过 libuv 中的线程池在 node.js 进程中使用额外的线程。这将取决于您的线程池的大小和操作的类型以及您的主机操作系统将使用多少额外的 CPU。在所有通过同一个磁盘的文件 I/O 上使用多个 CPU 并不一定有助于整体吞吐量,因为无论如何读/写通常都会受到磁盘上读/写磁头位置的瓶颈。

一些异步操作,如网络(如http模块)本质上是非阻塞和异步的,不会使用线程进行网络连接或触发任何有意义的额外 CPU 使用。

这些都不会在多个线程中运行您自己的 Javascript,因为 Javascript 本身都在一个线程中执行。

要充分利用多个 CPU,您可以:

  1. 将您自己的一些 Javascript 放入新的 nodejs工作线程中,并通过消息传递回主 node.js 线程。
  2. 启动您自己的 node.js 子进程以在这些子进程中工作,并使用许多进程间通信选项之一来传达结果。
  3. 使用 node.js 集群,以便可以在可用队列之间拆分传入请求。这需要确保任何服务器状态在所有集群进程之间都是可共享的(通常存储在所有进程都可以访问的某个数据库中)。这将允许单独的请求使用单独的 CPU - 它不会帮助单个请求使用更多的 CPU。您需要为此使用#1 和/或#2。

推荐阅读