为什么Node.js是单线程的?

福耶兹

在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。但是在Node.js中,所有客户端都在同一线程上运行(它们甚至可以共享相同的变量!)我知道I / O操作是基于事件的,因此它们不会阻塞主线程循环。

我不明白为什么Node的作者选择了它为单线程?这使事情变得困难。例如,我无法运行CPU密集型功能,因为它会阻塞主线程(并且会阻塞新的客户端请求),因此我需要产生一个进程(这意味着我需要创建一个单独的JavaScript文件并在其上执行另一个节点进程)它)。但是,在PHP cpu中,密集型任务不会阻止其他客户端,因为正如我提到的那样,每个客户端都在不同的线程上。与多线程Web服务器相比,它有什么优势?

注意:我已经使用集群解决了这个问题,但这并不是很漂亮。

克里斯·塔瓦雷斯

Node.js是作为异步处理中的实验而显式创建的。从理论上讲,与典型的基于线程的实现相比,在典型的Web负载下对单个线程执行异步处理可以提供更高的性能和可伸缩性。

你知道吗?我认为理论已经被证实。与Apache或IIS或其他基于线程的服务器相比,不占用大量CPU资源的node.js应用程序可以运行数千个并发连接。

单线程异步性质的确使事情变得复杂。但是,老实说,您认为它比线程处理还要复杂吗?一种种族状况可能会破坏您的整个月!或由于某处的设置而清空线程池,并观察响应时间变慢以进行爬网!更不用说死锁,优先级倒置以及与多线程相关的所有其他回旋。

最后,我不认为它普遍好坏。这是不同的,有时更好,有时则不是。使用正确的工具完成工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Node.js单线程与并发

如果node.js是单线程的,那么server.listen()为什么返回?

当节点为单线程时,为什么在node.js中需要连接池?

单线程Node.js如何同时处理请求?

Node.js-单线程,非阻塞?

Node.js如何同时异步和单线程?

Node.JS中的单线程事件循环与多线程非阻塞工作者

为什么我的多线程比单线程慢?

为什么并行foreach循环实现比单线程慢?

为什么无状态会话bean是单线程的?

为什么Redis是单线程的(事件驱动)

node.js单线程模型如何处理并发请求?

node.js集群,redis,单线程和非阻塞I / O如何工作?

单线程无阻塞IO模型在Node.js中的工作方式

多核CPU与Java(Tomcat)上的单线程Node.js

如何在node.js中创建后台单线程FIFO作业队列

“公牛”是否利用多核,因为node.js运行单线程

Hibernate Session是单线程的意味着什么?

在浏览器中,多线程WebAssembly的速度比单线程慢,为什么?

为什么多线程比单线程慢?(Linux,C,使用 pthread)

为什么我的多线程排序算法不比我的单线程mergesort快

为什么C#中的多线程快速排序比单线程慢

为什么多线程版本需要与单线程版本相同的时间?

为什么多线程的for循环不如单线程的性能好?

尽管多线程程序读取单独的txt文件,为什么它们比单线程程序慢?

为什么我的 4 线程实现不比单线程快?

为什么与CompletableFuture相比,多线程比单线程代码慢?

为什么在我的代码中单线程比多线程快?

为什么我的多线程程序比单线程程序慢?