当前位置: 首页 > article >正文

node.js之---事件循环机制

事件循环机制

Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础,它帮助 Node.js 在单线程中处理多个并发操作,同时避免了传统多线程模型中的性能开销。

事件循环的基本概念

Node.js 是单线程的,这意味着它的 JavaScript 代码是同步执行的。但是,Node.js 利用事件循环和异步 I/O 操作,使得可以在不阻塞主线程的情况下处理并发请求。事件循环是一个不断轮询的机制,它负责调度和执行异步操作。

事件循环的主要工作是:

  • 监听事件(如文件 I/O、网络请求等)
  • 处理回调函数
  • 维护事件队列

每当有异步操作(如数据库查询、文件读写、HTTP 请求等)完成时,事件循环会将相应的回调函数推送到事件队列中,事件循环则会依次执行这些回调函数。

事件循环的执行流程

Node.js 中的事件循环实际上是通过一系列阶段来执行的,每个阶段执行特定类型的回调。事件循环的阶段如下:

  1. Timers 阶段

    • 在这个阶段,事件循环会检查是否有定时器(如 setTimeout 和 setInterval)到期。如果到期,它会执行相应的回调函数。
  2. I/O Callbacks 阶段

    • 执行几乎所有的回调函数,除了定时器回调和 setImmediate() 回调。这个阶段处理的是系统的异步 I/O 操作,如文件系统操作、网络请求等。
  3. Idle, Prepare 阶段

    • 这是一个准备阶段,主要用于内部操作,开发者通常不会直接操作该阶段。
  4. Poll 阶段

    • 这是事件循环的核心阶段,负责查询事件队列。事件循环会在这个阶段等待事件队列中有待处理的事件。如果队列中有回调函数,它会执行这些回调。如果队列为空,则会继续等待事件。
  5. Check 阶段

    • 执行 setImmediate() 注册的回调函数。setImmediate() 是一种立即执行的机制,在事件循环的 "Check" 阶段执行。注意,setImmediate() 和 setTimeout() 具有不同的执行时机,setTimeout() 是基于时间延迟来调度回调,而 setImmediate() 则在当前事件循环周期中立即执行。
  6. Close Callbacks 阶段

    • 处理某些关闭回调,如 socket.on('close', callback) 或 fs.close() 的回调。

事件循环的生命周期

  1. 同步代码执行

    • 当 Node.js 应用启动时,主线程首先执行所有的同步代码。如果代码中存在 I/O 操作,它会被异步化,交由事件循环管理。
  2. 事件循环开始

    • 一旦同步代码执行完毕,事件循环开始运转,开始处理事件队列中的任务。
  3. 阶段执行

    • 事件循环按顺序执行上述的每个阶段。每个阶段的任务执行完成后,进入下一个阶段,直到所有回调函数都被执行完毕。
  4. 空闲和结束

    • 如果事件循环没有更多的任务要处理,它将进入空闲状态,直到下一次有事件到来。

分析以下代码的打印顺序

setTimeout(() => {
  console.log('5----------'); 
}, 10);

setImmediate(() => {
  console.log('3----------'); 
});

console.log('1----------'); 

setTimeout(() => {
  console.log('6----------'); 
}, 10);

setImmediate(() => {
  console.log('4----------');
});

console.log('2----------');

在node环境中的打印顺序


http://www.kler.cn/a/467726.html

相关文章:

  • 全面解读技术栈的作用及其积累路径:从开发到管理
  • LeetCode:2274. 不含特殊楼层的最大连续楼层数(排序 Java)
  • 通过爬虫方式实现视频号助手发布视频
  • 数据分析思维(七):分析方法——群组分析方法
  • 云备份项目--服务端编写
  • 【Unity报错】error Cs0103: The name ‘keyCode‘ does not exist in the current context
  • 力扣【SQL连续问题】
  • Spring源码分析之事件机制——观察者模式(二)
  • 理解linux内核中的几种地址
  • Java枚举和常量类的区别以及优缺点
  • wordpress开发之实现使用第三方库qrcode-generator生成二维码并上传和展示
  • 若依使用 Undertow 替代 Tomcat 容器
  • 密码学原理技术-第十一章-Hash Functions
  • java_配置使用nacos完整示例
  • 默认ip无法访问,利用dhcp功能获取ip进行访问的方法
  • 三子棋游戏
  • centos双网卡不能上网
  • Nginx:安装部署和升级(平滑升级)
  • js-19-手写题
  • 软件逆向之标志位
  • 【测试工具】 Postman 基本使用
  • 【Linux】调度优先级(谦让度)
  • spring、spring boot、Springmvc 的区别和关系
  • k8s集群部署 - Dashboard v2.7
  • MySQL 8 主从同步配置(Master-Slave Replication)
  • ESP32移植Openharmony外设篇(7)土壤湿度传感器YL-69