小编典典

为什么 Node.js 是单线程的?[关闭]

all

关闭 。这个问题是基于意见的。它目前不接受答案。


想改进这个问题?
更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。

8年前关闭。

社区在5 个月前审查了是否重新打开此问题并将其关闭:

原始关闭原因未解决

改进这个问题

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

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

注意:我使用集群来解决这个问题,但它并不漂亮。


阅读 83

收藏
2022-04-29

共1个答案

小编典典

Node.js 是作为异步处理的实验显式创建的。理论上,在单线程上进行异步处理可以在典型的 Web 负载下提供比典型的基于线程的实现更高的性能和可扩展性。

你知道吗?在我看来,这个理论已经得到证实。与 Apache 或 IIS 或其他基于线程的服务器相比,不执行 CPU 密集型工作的 node.js
应用程序可以运行数以千计的并发连接。

单线程、异步的特性确实使事情变得复杂。但是你真的认为它比线程更复杂吗?一个比赛条件可能会毁了你整个月!或者由于某处的某些设置而清空您的线程池,并观察您的响应时间缓慢到爬行!更不用说死锁、优先级倒置以及多线程带来的所有其他问题。

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

2022-04-29