当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 14:41:36 Node.js

原文:为什么Node.js是单线程语言?构建在node.js之上的应用程序使用单线程事件循环模型架构来处理多个并发客户端,例如JSP、SpringMVC、ASP.NET、HTML、Ajax、jQuery等。还有其他Web技术可以使用,但这些列出的技术遵循“多线程请求-响应”架构来处理多个并发客户端。单线程:NodeJS平台不遵循多线程请求/响应无状态模型。它遵循单线程和事件循环模型。NodeJSProcessing模型在很大程度上受到了JavaScript基于事件的模型的启发,具有JavaScript回调机制。因此,Node.js可以轻松处理更多并发的客户端请求。事件循环是Node.js处理模型的核心,如下图所示。n=对Node.jsWeb服务器的客户端请求数。假设他们都访问我们构建在Node.js之上的Web应用程序,客户端是Client-1,Client-2。..客户端-n。m=线程池中的线程数。Web服务器接收Client-1,Client-2。..直到Client-n请求并将它们放入事件队列。单线程事件循环相对于多线程请求/响应无状态模型的优势:可以轻松处理越来越多的并发客户端请求。得益于事件循环,无需创建越来越多的线程。构建在node.js之上的应用程序使用尽可能少的线程来减少内存或资源使用。node.js使用单线程事件循环模型架构的原因:最初,node.js是作为异步处理的实验而创建的,理论上单线程上的异步处理可以在典型情况下提供更多的性能和与典型的基于线程的实现相比,Web负载下的可扩展性密集的东西,并且可以运行数千个并发连接,而??不是Apache或IIS或其他基于线程的服务器。node.js的单线程、异步特性也确实使事情变得复杂,但就设计应用程序所花费的时间、开发成本、死锁、优先级倒置和所有应用程序生命周期问题而言,线程比线程更重要。哎呀。使用线程响应服务器的每个请求的模型的另一个众所周知且受到批评的问题是,与事件循环线程模型相比,它们在许多情况下都不能很好地扩展。简而言之,它们缺乏随着应用程序的增长来满足未来需求和添加新功能的可扩展性。由于Node.js遵循单线程事件循环模型,因此它受到了JavaScript基于事件的模型和JavaScript回调机制的启发。因此,node.js像JavaScript一样是单线程的,但不是纯JavaScript代码,这意味着异步完成的事情,如网络调用、文件系统任务、DNS查找等,实际上并不由主线程处理。单线程非阻塞IO模型如何在NodeJS中工作?例子:如果我们收到两个用户A和B的请求,通过非阻塞IO,我们可以向A发起请求,然后立即向B发起请求,而不用等待A的请求得到响应。所以我们可以说有了非阻塞IO我们就可以不用多线程了,因为节点服务器可以同时处理多个请求。单线程非阻塞IO的工作原理:当客户端向服务器发送请求时,该请求称为事件。所有这些请求都存储在一个事件队列中。事件循环中存在的单个线程将此请求分配给内部线程池中存在的线程之一。此线程读取客户端请求、处理请求、在需要时执行任何阻塞IO操作,并准备将最终响应发送回服务器。事件循环将此响应发送回相应的客户端。事件循环无限接收请求并处理它们。由于事件循环,不需要多线程。由于这种事件循环和单线程的概念,node.js使用更少的资源和内存。更多Jerry原创文章在这里:《王子熙》: