Node.js的核心之事件循环过程

 更新时间:2026年05月18日 09:12:51   作者:网络点点滴  
本文简要介绍了Node.js的事件循环机制和执行细节,并解释了微任务的相关概念,事件循环通过回调函数来处理异步操作,确保程序的高效运行

一、为什么需要事件循环?

之前一直说过了,Node.js是单线程的,所谓的单线程就是一次只能干一件事;如果Node.js什么都没做,那么比如当读取一个大文件的时候,整个程序立马就会卡住;这个时候就需要一个调度中心,来负责编排任务,这个就是事件循环的作用;

简述:

  • 比如将一些耗时的I/O操作,例如HTTP请求、计时器超时、文件读取完成等等操作到事件循环之后,会交给系统内核或线程池异步处理;
  • 所有的位于回调函数中的,除了顶层代码中的应用程序都会进入中事件循环中;
  • Node.js基于回调函数来构建;
  • 事件驱动架构:事件被发出、事件循环拾取它们、回调函数被调用;
  • 事件循环只负责编排,具体的事情并不由它亲自完成;

二、事件循环的细节-执行阶段

事件循环会不断循环,每次循环称为一个tick。每个tick会经过几个阶段,每个阶段都有一个FIFO先进先出队列存放着待执行的回调

详解

  1. timers阶段

执行由setTimeout()和setInterval()安排的回调

这个执行的时机并不是精确的时间,而是检查定时器是否到达时间阈值;比如你设定时器100ms,可能100ms之后才能执行,因为事件循环有可能忙于其他阶段;

  1. pending callbacks阶段

执行一些系统操作的回调,比如TCP错误ECONNREFUSED,这些回调在poll阶段会被挂起,在这些会执行;

  1. idle,prepare阶段

这个阶段是Node.js内部使用,作为开发人员我们接触不到,也不用去了解

  1. poll阶段—这个是最重要的阶段

这个阶段做两个事情

  • 计算应该阻塞并等待I/O需要多久。(比如由timer快到时间了,就只阻塞到timer时间,如何没有待处理的任务,就一直等待新事件;)
  • 第二个事就是处理poll队列中的事件,然后执行I/O相关的回调。比如网络请求,读取文件之类的操作;

规则:

  • 如果poll队列不为空,事件循环会同步执行队列里的回调,直到队列为空或者达到系统的限制;
  • 如果poll为空的话但是有setImmediate回调,则立刻结束poll阶段,进入check阶段;如果没有setImmediate回调,就是在此一直等待新的事件进入队列,然后立即执行它们。这个等待事件是由timer决定的
  1. check阶段

这个阶段是专门为setImmediate()设计的。当poll阶段结束后,如果check队列由回调的话,就立即执行它们;

  1. close callbacks阶段

执行关闭事件的回调,比如socket.on(‘close’,…)。如果一个socket或句柄突然关闭,close事件也会立即发出

三、微任务

Node.js由两个非常重要的微任务:process.nextTick队列以及Promise回调队列,比如.then()、.catch等等

这两个微任务在上述6个阶段中每个阶段执行完后,都会检查一下,由微任务存在的话都会立即清空它们,然后才会去进行下一个阶段;

注意事项

  1. 不要再回调函数中使用fs、crypto和zlib模块的同步版本函数;
  2. 不要执行复杂计算(例如嵌套循环)
  3. 在大型对象中使用JSON时要小心
  4. 不要使用过于复杂的正则表达式(例如嵌套的量化符s)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用 Node.js和Express搭建服务器的过程步骤详解

    使用 Node.js和Express搭建服务器的过程步骤详解

    Node.js 是一个开源、跨平台的 JavaScript 运行时环境,这篇文章主要介绍了如何使用 Node.js和Express搭建服务器,需要的朋友可以参考下
    2023-09-09
  • node脚本实现自动化签到和抽奖功能

    node脚本实现自动化签到和抽奖功能

    本文主要介绍了node脚本实现自动化签到和抽奖功能,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • gulp安装以及打包合并的方法教程

    gulp安装以及打包合并的方法教程

    这篇文章主要给大家介绍了关于gulp实现人一个打包合并的方法教程,并分享了gulp打包js/css时合并成一个文件时的顺序的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • Node.js dgram模块实现UDP通信示例代码

    Node.js dgram模块实现UDP通信示例代码

    这篇文章主要介绍了Node.js dgram模块实现UDP通信示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Node.js assert断言原理与用法分析

    Node.js assert断言原理与用法分析

    这篇文章主要介绍了Node.js assert断言原理与用法,结合实例形式分析了assert模块断言函数与使用技巧,需要的朋友可以参考下
    2019-01-01
  • Node.js之构建WebSocket服务全过程

    Node.js之构建WebSocket服务全过程

    这篇文章主要介绍了Node.js之构建WebSocket服务全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • node管理统计文件大小并显示目录磁盘空间状态从零实现

    node管理统计文件大小并显示目录磁盘空间状态从零实现

    这篇文章主要为大家介绍了node管理统计文件大小并显示目录磁盘空间状态的从零实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Windows 系统下安装和部署Egret的开发环境

    Windows 系统下安装和部署Egret的开发环境

    Egret基于TypeScript开发的,而TypeScript编译工具tsc是基于Node.js 开发的。所以在安装过程中,我们先需要对于基础支持工具进行安装。
    2014-07-07
  • node.js环境搭建图文详解

    node.js环境搭建图文详解

    Node.js 是一个让 JavaScript 运行在服务端的开发平台,小编在空闲时间就研究nodejs的相关知识,下面是本文给大家带来的node.js环境搭建教程图解,感兴趣的朋友跟随小编一起学习吧
    2018-09-09
  • 如何利用node转发请求详解

    如何利用node转发请求详解

    这篇文章主要给大家介绍了关于利用node转发请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论