javascript 为什么node.js不适合高CPU应用程序?

muk1a3rh  于 2023-02-11  发布在  Java
关注(0)|答案(5)|浏览(128)

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

gajydyqb

gajydyqb1#

尽管节点采用异步事件模型,但它本质上是单线程的。当你启动一个节点进程时,你是在单核上运行一个具有单个线程的单个进程。因此你的 * 代码 * 不会被并行执行,只有I/O操作是并行的,因为它们是异步执行的。因此,长时间运行CPU任务会阻塞整个服务器,通常是个坏主意。
假设您只是像这样启动一个Node进程,那么多个Node进程并行运行是可能的。这样您仍然可以从多线程架构中获益,尽管单个Node进程不能。您只需要在前面有一些负载平衡器,它可以在所有Node进程之间分配请求。
另一种选择是让CPU在单独的进程中工作,并让节点与这些进程交互,而不是自己工作。
相关阅读内容:

nnt7mjpx

nnt7mjpx2#

一个简单的Node.js服务器是单线程的,这意味着任何需要很长时间执行的操作都会阻止程序的其余部分运行。Node.js应用程序通过将其作为一系列事件来工作,设法保持高级别的并发性。当事件处理程序等待某个事件发生时,(例如从数据库中阅读),它告诉节点继续前进并同时处理另一个事件。但由于单个线程一次只能执行一条指令,这种方法并不能让你避免一个需要长时间保持活跃执行的函数。在多线程架构中,即使一个函数花了很长时间来计算结果,其他线程仍然可以处理其他请求--而且只要你有一个内核当时没有被完全使用,他们很有可能可以像根本没有其他请求在运行一样快地完成它。
为了解决这个问题,Node.js生产应用程序通常会占用大量的CPU,它们通常会在集群中运行。这意味着,不是在一个程序的内存空间中有多个线程,而是在一个“主”示例的控制下运行同一程序的多个示例。每个进程都是单线程的,但由于您有多个线程,因此最终会获得多线程的好处。

0h4hbjxa

0h4hbjxa3#

节点是完美的,如果你有异步任务,因为java脚本将运行这些东西的工人池。但如果你运行CPU密集型任务(你大量使用CPU)例如,你有十亿用户,你想排序这些人的名字。它退出一个密集型任务,这是同步的,这将阻止其他代码的运行。
因此,对于这类应用程序,使用node不是一个好主意。从技术上讲,你可以找到替代方法来处理这类任务。上面的例子最好在DB中处理。然后传递结果就很好了。
以同样的方式避免激烈的任务,并保持您的CPU冷却更好的性能

f4t66c6m

f4t66c6m4#

您可以查看这个包the-computer,它可以帮助您以简单的方式在node.js应用程序的单个示例中完成一些CPU密集型工作。
当然,它不如raw c++ libs有效,但它可以覆盖大多数通用计算情况,让您在node.js花园中,同时允许您利用杯子的核心。

ix0qys7i

ix0qys7i5#

js在单个线程中运行JavaScript代码,这意味着您的代码一次只能执行一个任务。然而,Node.js本身是多线程的,并通过libuv库提供隐藏线程,该库处理I/O操作,如从磁盘阅读文件或网络请求。通过使用隐藏线程,js提供了异步方法,允许您的代码在不阻塞主线程的情况下发出I/O请求。
尽管Node.js有隐藏线程,但您不能使用它们来卸载CPU密集型任务,如复杂计算、图像大小调整或视频压缩。由于JavaScript在CPU密集型任务运行时是单线程的,因此它会阻塞主线程,并且在任务完成之前不会执行其他代码。如果不使用其他线程,加快CPU密集型任务的唯一方法是提高处理器速度。
💡 js引入了worker-threads模块,它允许创建线程并并行执行多个JavaScript任务。它会向主线程发送一条包含操作结果的消息,以便它可以与代码的其他部分一起使用。使用工作线程的优点是CPU绑定的任务不会“t阻塞主线程,您可以将一个任务划分并分发给多个工作线程以优化它。
参考:https://www.digitalocean.com/community/tutorials/how-to-use-multithreading-in-node-js

相关问题