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

Node.js事件循环_2

时间:2023-04-03 12:25:35 Node.js

什么是事件循环Node.js是单进程单线程应用,但是由于V8引擎提供了异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。事件循环使Node.js能够执行非阻塞I/O操作,尽管JavaScript是单线程的,但事件循环通过尽可能将操作卸载到系统内核来实现这一点。因为目前主流的内核都是多线程的,内核可以处理后台执行的多个操作。当其中一个操作完成时,内核告诉Node.js相应的回调被添加到轮询队列并最终执行。事件循环操作Node.js一开始会初始化事件循环,处理目标脚本,脚本可能会进行异步API调用、定时任务或process.nextTick(),然后启动事件循环。下面是事件循环的运行顺序:上图中的每个方框代表事件循环的一个阶段,每个阶段维护一个先进后出的可执行回调函数队列。每个阶段都有自己的特殊行为,即当事件循环进入给定阶段时,执行该阶段中的任何操作,然后执行该阶段队列中的回调函数,直到队列为空,或回调函数调用达到上限。当满足这两个条件时,事件循环将进入下一阶段。每个阶段引入定时器(timers):这个阶段执行通过setTimeout()和setInterval()调度的回调函数。I/O回调:对几乎所有的异常执行关闭回调,定时器调度的回调和setImmediate()。空闲、准备:内部使用。poll(轮询):获取新的I/O事件,此时nodejs会根据实际情况进行阻塞。check:setImmediate()设置的回调函数。关闭回调:例如socket.on('close',...)设置回调。在事件循环运行之间,Node.js检查是否有任何异步I/O或定时器在等待,如果没有,则清除并结束事件循环。事件驱动程序Node.js使用事件驱动模型。当Web服务器收到请求时,它会关闭它并处理它,然后为下一个Web请求提供服务。当请求完成后,将其放回处理队列,当到达队列头部时,将结果返回给用户。该模型非常高效且可扩展,因为网络服务器总是在不等待任何读取或写入操作的情况下接受请求。Node.js内置了多种事件,可以通过引入事件模块并实例化EventEmitter类来进行绑定和监听。示例://导入事件模块varevents=require('events');//创建eventEmitter对象vareventEmitter=newevents.EventEmitter();绑定事件处理器:eventEmitter.on('eventName',eventHandler);通过程序触发事件:eventEmitter.emit('eventName');以下是完整代码(drive.js):varevents=require('events');vareventEmitter=newevents.EventEmitter();varconnectHandler=functionconnected(){console.log('连接成功');eventEmitter.emit('data_received');}eventEmitter.on('connection',connectHandler);eventEmitter.on('data_received',function(){console.log('数据接收成功');});//触发连接事件eventEmitter.emit('connection');console.log("程序执行完成");启动drive.js文件:>nodedrive.js连接成功,接收数据成功程序更多详情执行后可查看:https://www.9xkd.com/3716132715.html