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

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

我在这里读了Felix Baumgarten

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

假设你只是像这样开始一个Node进程,那么可以让多个Node进程并行运行。 这样,您仍然可以从multithreading体系结构中获益,尽pipe单个Node进程不会。 您只需要在前面安装一些负载平衡器,即可沿您的所有节点进程分发请求。

另一个select是让CPU在单独的进程中工作,并使Node与这些进程交互,而不是自己做这个工作。

相关阅读:

  • Node.js和CPU密集型的请求
  • 了解node.js事件循环

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

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