为什么node.js不适合繁重的CPU应用?

vuv*_*uvu 41 javascript node.js

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

我在这里读到Felix Baumgarten

pok*_*oke 75

尽管是异步事件模型,但节点本质上是单线程的.启动节点进程时,您正在单个核心上运行单个线程的单个进程.因此,您的代码不会并行执行,只有I/O操作是并行的,因为它们是异步执行的.因此,长时间运行的CPU任务将阻止整个服务器,通常是一个坏主意.

假设您刚刚启动这样的Node进程,则可以并行运行多个Node进程.这样,您仍然可以从多线程体系结构中受益,尽管单个Node进程不会.您只需要在前面安装一些负载均衡器,以便在所有Node进程中分配请求.

另一个选择是让CPU在不同的进程中工作,并使Node与那些进行交互而不是自己完成工作.

相关内容:

  • 您的代码不会在这些工作线程上运行.它们仅在您异步启动某些内容时使用(I/O内容),但只要它们调用回调,您就会重新启动事件循环.所以你编写的所有代码都将在一个线程上. (6认同)
  • 执行回调的工作线程怎么样,根据本文,这些线程属于线程池:http://www.aaronstannard.com/post/2011/12/14/Intro-to-NodeJS-for-NET-Developers。 ASPX (2认同)

Chu*_*uck 18

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

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