59

Node.js 服务器在 I/O 和大量客户端连接方面非常高效。但是,与传统的多线程服务器相比,为什么 node.js 不适合重 CPU 应用程序呢?

我在这里读到了Felix Baumgarten

4

4 回答 4

95

尽管 Node 具有异步事件模型,但它本质上是单线程的。当你启动一个 Node 进程时,你是在一个内核上运行一个带有单个线程的单个进程。所以你的代码不会被并行执行,只有 I/O 操作是并行的,因为它们是异步执行的。因此,长时间运行的 CPU 任务会阻塞整个服务器,通常是个坏主意。

鉴于您只是像这样启动一个 Node 进程,尽管可以让多个 Node 进程并行运行。这样,您仍然可以从多线程架构中受益,尽管单个 Node 进程不能。你只需要在前面有一些负载均衡器,沿着你的所有节点进程分发请求。

另一种选择是让 CPU 在单独的进程中工作,并让 Node 与这些进程交互,而不是自己完成工作。

相关阅读:

于 2013-06-07T00:59:59.510 回答
24

一个简单的 Node.js 服务器是单线程的,这意味着任何需要很长时间才能执行的操作都会阻止程序的其余部分运行。Node.js 应用程序通过作为一系列事件工作来设法维持高水平的并发性。当一个事件处理程序正在等待某件事发生(例如从数据库中读取)时,它会告诉 Node 继续并在此期间处理另一个事件。但是由于单个线程一次只能执行一条指令,因此这种方法无法将您从需要长时间主动执行的函数中解救出来。在多线程架构中,即使一个函数需要很长时间来计算结果,其他线程仍然可以处理其他请求——只要你有一个当时没有完全使用的核心,就会有'

为了解决这个问题,预计会占用大量 CPU 的生产 Node.js 应用程序通常会在集群中运行。这意味着您不必在一个程序的内存空间中拥有多个线程,而是在一个“主”实例的控制下运行同一程序的多个实例。每个进程都是单线程的,但是由于您有多个进程,您最终会获得多线程的好处。

于 2013-06-07T01:03:47.017 回答
2

如果你有异步任务,Node 是完美的,因为 java 脚本将通过工作池运行这些东西。但是,如果您运行 CPU 密集型任务(您大量使用 CPU 的地方)例如,您有十亿用户,并且您想按名称对这些人进行排序。它退出了一个 Intense 任务,这是同步的,它将阻止其他代码运行。

因此,将节点用于此类应用程序并不是一个好主意。从技术上讲,您可以找到解决此类任务的替代方案。上面的示例在 Db 中更好地解决。然后通过这个结果很棒。

以同样的方式避免 Intense 任务并保持 CPU 冷却以获得更好的性能

于 2019-11-22T12:21:16.480 回答
1

你可以看看这个包,the-computer,它可以帮助你以简单的方式在 node.js 应用程序的单个实例中做一些 cpu 密集型工作。

绝对不如原始的 c++ 库那么有效,但它可以涵盖大多数通用计算案例,让您在 node.js 的花园中,同时允许您利用杯子的核心。

于 2019-03-20T10:29:58.993 回答