Node.js服务器在I / O和大量客户端连接方面非常有效。但是,与传统的多线程服务器相比,为什么node.js不适合繁重的CPU应用?
我在这里阅读Felix Baumgarten
答案 0 :(得分:63)
Node尽管是异步事件模型,但本质上是单线程的。启动节点进程时,您正在单个核心上运行单个线程的单个进程。因此,代码不会并行执行,只有I / O操作是并行的,因为它们是异步执行的。因此,长时间运行的CPU任务将阻塞整个服务器,通常是个坏主意。
鉴于您只是启动这样的Node进程,可以让多个Node进程并行运行。这样,您仍然可以从多线程体系结构中受益,尽管单个Node进程没有。您只需要在前面安装一些负载均衡器,以便在所有Node进程中分配请求。
另一个选择是让CPU在不同的进程中工作,并让Node与那些进行交互而不是自己完成工作。
阅读相关内容:
答案 1 :(得分:16)
一个简单的Node.js服务器是单线程的,这意味着任何需要很长时间才能执行的操作都会阻止程序的其余部分运行。 Node.js应用程序通过作为一系列事件来管理以维持高水平的并发性。当事件处理程序正在等待某些事情发生时(例如从数据库中读取),它会告诉Node继续并同时处理另一个事件。但由于单个线程一次只能执行一条指令,因此这种方法无法使您远离需要长时间保持主动执行的功能。在多线程体系结构中,即使一个函数需要很长时间来计算结果,其他线程仍然可以处理其他请求 - 只要你有一个当时没有完全使用的核心,他们很有可能做到它就像没有任何其他请求一样快速运行。
为了解决这个问题,预计占用大量CPU的生产Node.js应用程序通常会在集群中运行。这意味着,不是在一个程序的内存空间中有多个线程,而是在一个“master”实例的控制下运行同一程序的多个实例。每个进程都是单线程的,但由于你有几个进程,你最终会获得多线程的好处。
答案 2 :(得分:1)
您可以查看此软件包the-computer,它可以帮助您以一种简单的方式在node.js应用程序的单个实例中完成一些CPU密集型工作。
它肯定不如原始c ++库有效,但它可以涵盖大多数常规计算案例,使您可以在node.js花园中使用,同时还可以利用杯子的核心。
答案 3 :(得分:1)
如果您具有异步任务,那么节点是完美无缺的,因为Java脚本将按工作程序池运行这些任务。但是,如果您运行CPU密集型任务(在其中大量使用CPU的情况下),则Ex有十亿用户,并且您想按名称对这些人进行排序。它退出了Intense任务,并且这是同步的,它将阻止其他代码运行。
因此,将节点用于此类应用程序不是一个好主意。从技术上讲,您可以找到替代方案来解决此类任务。在Db中可以更好地解决以上示例。那么通过该结果就很棒。
以同样的方式避免执行繁重的任务,并保持CPU凉爽以提高性能