当前位置: 首页 > Web前端 > JavaScript

深入理解Node.js事件驱动模型

时间:2023-03-26 23:33:26 JavaScript

本文主要讨论以下问题:1.Node.js事件驱动模型解析2.Node.js如何处理高并发请求?3、Node.js的缺点介绍首先简单介绍一下Node.js。Node.js是一个基于事件驱动、非阻塞I/O模型的服务器端JavaScript运行环境。它是一种基于谷歌V8引擎、高性能JavaScript语言的单线程服务器端运行。一、Node.js事件驱动模型分析理解了上图,你就理解了Node.js的事件驱动模型。从上图中,我们可以看到以下几个部分:应用层,也就是JavaScript交互层,是Node.js的一个常用模块,比如http,fs等。V8是V8引擎层,主要是用于解析JavaScript并与应用层和NodeApi层进行交互。NodeApi为上层模块提供系统调用,与操作系统进行交互。libuv是一个跨平台的底层包,实现了线程池、事件循环、文件操作等,实现异步是Node.js的核心。Libuv层维护着事件队列的事件队列。当请求到来时,Node.js应用层和NodeApi层将请求作为事件放入事件队列,设置回调事件函数,然后继续接受新的请求。在Libuv层的EventLoop事件循环中,不断读取事件队列中的事件。在读取事件的过程中,如果遇到非阻塞事件,会自行处理,处理完成后调用回调函数将结果返回给下一层。对于阻塞事件,会委托给后台线程池处理。当这些阻塞操作完成后,执行结果会连同提供的回调函数一起放入事件队列中。当事件循环再次读取事件时,会再次执行放在队列中的事件回调函数,最后将结果返回给上级。具体可以参考下图:2.Node.js是如何处理高并发请求的?如果你理解了最后一个问题,就很容易理解了。如果要总结的话,就是异步非阻塞编程的思想。当遇到耗时操作时,会以异步非阻塞的方式进入事件队列,不会影响后续请求的执行。循环会读取这个耗时的请求,交给线程池处理。这些耗时操作处理完后,会再次进入事件队列,请求结果会通过事件循环和回调返回给上层应用,最后返回给客户端。以上方法减少了高并发的等待时间,从而从容应对高并发。3.Node.js的缺点介绍通过上面的介绍,我们知道了Node.js的事件驱动模型。接下来,我们将介绍Node.js的缺点。Node.js的最大缺点是它一次只能处理一个请求。目前大部分服务器都是多核CPU,导致CPU利用率很低,造成资源浪费。Node.js的主线程EventLoop按照事件队列的先后顺序执行事件队列中的事件。在其中一个任务完成之前,回调和侦听器等其他函数都没有机会运行,因为阻塞的事件循环没有机会处理它们。如果发生这种情况,程序执行会变慢。点击此处下载完整附件