Node.js 的单线程事件驱动模型和内置的线程池模型

2021-10-09  本文已影响0人  华山令狐冲

原文:Why Node.js is a single threaded language ?

构建在 node.js 之上的应用程序使用单线程事件循环模型架构来处理多个并发客户端,如 JSP、Spring MVC、ASP.NET、HTML、Ajax、jQuery 等。存在其他可以使用的 web 技术,但这些列出的技术遵循“多线程请求-响应”架构来处理多个并发客户端。

单线程:Node JS 平台不遵循多线程请求/响应无状态模型。 它遵循单线程与事件循环模型。 Node JS Processing 模型主要受 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 遵循单线程事件循环模型,其灵感来自 JavaScript 基于事件的模型和 JavaScript 回调机制。因此,node.js 是类似于 JavaScript 的单线程,但不是纯 JavaScript 代码,这意味着像网络调用、文件系统任务、DNS 查找等异步完成的事情实际上并不由主线程处理。

How the single threaded non blocking IO model works in NodeJS ?

示例:如果我们收到来自两个用户 A 和 B 的请求。通过非阻塞 IO,我们可以发起对 A 的请求,然后立即对 B 发起请求,而无需等待对 A 请求的响应。因此我们可以说借助 non -blocking IO 我们可以消除多线程的使用,因为节点服务器可以同时处理多个请求。

Working of single-threaded non-blocking IO:

当客户端向服务器发送请求时,该请求称为事件。 这些所有请求都存储在一个事件队列中。 事件循环中存在的单个线程将此请求分配给内部线程池中存在的线程之一。

该线程读取客户端请求,处理请求,在需要时执行任何阻塞 IO 操作,并准备将最终响应发送回服务器。 事件循环将此响应发送回相应的客户端。

事件循环无限地接收请求并处理它们。

由于事件循环,不需要多个线程。 由于这个事件循环和单线程的概念,node.js 使用更少的资源和内存。

更多Jerry的原创文章,尽在:"汪子熙":


上一篇 下一篇

猜你喜欢

热点阅读