为什么 Node.js 是单线程语言?
在 node.js 之上构建的应用程序使用单线程事件循环模型架构来处理多个并发客户端,如 JSP、Spring MVC、ASP.NET、HTML、Ajax、jQuery 等。是其他可以使用的 Web 技术,而不是 node .js 但这些列出的技术遵循“多线程请求-响应”架构来处理多个并发客户端。
单线程: Node JS 平台不遵循多线程请求/响应无状态模型。它遵循带有事件循环的单线程模型。 Node JS 处理模型主要受 JavaScript 基于事件的模型和 JavaScript 回调机制的启发。因此,Node.js 可以轻松处理更多并发客户端请求。事件循环是 Node.js 处理模型的核心,如下图所示。
图表说明:
n = 客户端对 Node.js Web 服务器的请求数。
假设他们同时访问我们构建在 Node.js 之上的 Web 应用程序客户端是 Client-1,Client-2。 . .客户-n。
m = 线程池中的线程数。
Web 服务器接收 Client-1, Client-2 。 . .直到 Client-n 请求并将它们放入事件队列中。
单线程事件循环相对于多线程请求/响应无状态模型的优势:
- 可以轻松处理越来越多的并发客户端请求。
- 由于事件循环,消除了创建越来越多线程的需要。
- 基于 node.js 构建的应用程序使用尽可能少的线程来减少内存或资源使用。
node.js 使用单线程事件循环模型架构的原因:
- 最初,node.js 是作为异步处理的一个实验而创建的,理论上在单线程上进行异步处理可以在典型的 Web 负载下提供比在应用程序不使用 CPU 时典型的基于线程的实现更高的性能和可伸缩性密集的东西,并且可以运行比 Apache 或 IIS 或其他基于线程的服务器更多的并发连接。
- node.js 的单线程、异步特性也确实使事情变得复杂,但就设计应用程序所花费的时间、开发成本、死锁、优先级反转以及所有其他方面而言,线程比这更糟糕。应用程序的生命周期。
- 对于服务器的每个请求一个线程模型还有一个众所周知和备受批评的问题,即与事件循环线程模型相比,它们在多个场景中的扩展性都不是很好,简而言之,它们作为应用程序缺乏可扩展性增长以满足未来的需求,并增加了新的功能。
- 由于 Node.js 遵循带有事件循环模型的单线程模型,该模型受 JavaScript 基于事件的模型和 JavaScript 回调机制的启发。因此,node.js 是类似于 JavaScript 的单线程,但不是纯 JavaScript 代码,这意味着网络调用、文件系统任务、DNS 查找等异步完成的事情实际上不由主线程处理,并且在 C++ 中为Ryan Dahl 不是 JavaScript 的粉丝,而且 C++ 可以访问多个线程,这使其成为一种更好的异步任务语言。
参考: https://nodejs.org/en/docs/