Node.js Event Loop各阶段讲解

Node.js Event Loop各阶段讲解

Node.js的Event Loop是其异步非阻塞I/O的关键之一,它被设计成高效运行大量并发请求的系统,各个阶段的功能也可以让我们更好地理解Node.js的运行机制。

各阶段讲解

Node.js的Event Loop包含6个阶段,按顺序分别是:

  1. timers:处理定时器操作;
  2. pending callbacks:执行一些系统操作的回调;
  3. idle, prepare:内部使用,用于修复它们两个之间的调用顺序;
  4. poll:对I/O事件进行轮询;
  5. check:执行setImmediate API的回调;
  6. close callbacks:执行一些关闭事件的回调。

下面我们详细讲解每个阶段:

timers

这个阶段会检查是否有定时器满足条件,如果有,就会执行这些定时器的回调函数。setTimeout和setInterval是基于这个阶段的。需要注意的是,执行定时器回调是有顺序的。

pending callbacks

这个阶段会执行一些系统操作的回调,如TCP错误的回调。

poll

这个阶段是Event Loop中最常用的一个阶段,用于轮询I/O事件并执行对应的回调。在进入此阶段时,如果定时器阶段没有定时器需要执行,会发生以下两件事之一:

  • 如果poll队列为空,Node.js 会阻塞在这个阶段等待I/O事件的触发;
  • 如果poll队列不为空,Node.js 会处理每一个事件,直到poll队列为空或达到系统限制。

如果事件到达了其poll事件队列,而且poll已经被添加到活动的定时器列表中,Node.js会在第一个可用的时间运行它的处理程序。因此,poll阶段和定时器阶段可以相互交错。如果在进入此阶段时已经有定时器需要执行,它们将直接转到定时器阶段。

check

这一阶段主要是执行setImmediate() API的回调。在前面的示例中可以看到,setImmediate() 回调优先于 I/O 事件执行。例如:

setImmediate(() => {
  console.log('Set Immediate');
});

fs.readFile('./example.txt', () => {
  console.log('I/O Callback');
});

console.log('Hello World');

上面的代码会首先执行 'Hello World',然后执行I/O Callback,最后执行Set Immediate。

close callbacks

这个阶段执行一些关闭事件的回调函数,例如socket.on('close', ...)。

示例说明

以上就是Node.js Event Loop各阶段的详细讲解。下面我们来看两个示例:

示例1

setImmediate(() => {
  console.log('Set Immediate');
});

setTimeout(() => {
  console.log('Set Timeout Timer');
}, 0);

console.log('Hello World');

这个示例中,Node.js 先完成当前运行的同步代码,输出 "Hello World",接着进入 timers 阶段,但此阶段中没有定时器需要执行,于是 Node.js 进入 poll 阶段并阻塞等待。由于示例中发生了跨阶段的定时,因此事件触发时先执行 check 阶段的 setImmediate 回调,然后执行 timers 阶段的 setTimeout 回调,输出 "Set Timeout Timer",最后输出 "Set Immediate"。

示例2

const fs = require('fs');

fs.readFile('./example.txt', () => {
  setTimeout(() => {
    console.log('Set Timeout Timer');
  }, 0);

  setImmediate(() => {
    console.log('Set Immediate');
  });

  console.log('I/O Callback');
});

console.log('Hello World');

这个示例中,Node.js 先完成当前运行的同步代码,输出 "Hello World",接着进入 timers 阶段,但此阶段中没有定时器需要执行,于是 Node.js 进入 poll 阶段。在 poll 阶段中,Node.js 处理 fs.readFile 事件,并执行回调。由于示例中发生了跨阶段的定时,因此事件触发时先执行 check 阶段的 setImmediate 回调,然后执行 timers 阶段的 setTimeout 回调,输出 "Set Timeout Timer",最后输出 "Set Immediate"。

以上两个示例可以帮助读者更好地理解 Node.js 的 Event Loop 的执行流程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js Event Loop各阶段讲解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Node 文件查找优先级及 Require 方法文件查找策略

    Node 文件查找优先级及 Require 方法文件查找策略 在 Node.js 中,当我们使用 require 方法加载模块时,Node.js 会按照一定的文件查找策略来查找相应的模块文件。掌握这些策略对于理解 Node.js 模块化机制非常重要。 文件查找优先级 在加载模块时,Node.js 会按照以下顺序查找模块文件: 核心模块:如果你加载的是一个 N…

    node js 2023年6月8日
    00
  • 使用js实现单链解决前端队列问题的方法

    使用 JavaScript 实现单链解决前端队列问题的方法,可以分为以下几个步骤: 1. 创建队列类 我们可以使用面向对象的思想,创建一个队列类,里面包含一些常用的属性和方法。具体来说,我们可以定义一个 Queue 类,其中包含属性 head 和 tail 分别代表队列头尾指针,为空时都指向 null,以及方法 enqueue() 和 dequeue() 分…

    node js 2023年6月8日
    00
  • 用Cordova打包Vue项目的方法步骤

    当我们使用Vue进行前端开发时,需要将Vue项目打包为可发布的代码,以便部署到生产环境或应用商店中。同时,我们也可以使用Cordova进行原生应用的开发,有效地为Vue应用添加了上架到应用商店的途径。下面是使用Cordova打包Vue项目的方法步骤: 一、安装Cordova 首先,需要在本地安装Cordova。安装方法如下: npm install -g c…

    node js 2023年6月8日
    00
  • JS异步错误捕获的一些事小结

    JS异步错误捕获的一些事小结 背景 随着前端项目逐渐变大、代码逐渐复杂,异步错误的捕获成为前端开发中的难点之一。本文将结合实际应用场景,介绍JS异步错误捕获的一些事情。 具体内容 Promise Promise的错误捕获是一个重要的部分,一般来说我们需要用到 then() 中的第二个参数来进行错误捕获。示例代码如下: fetch(‘http://exampl…

    node js 2023年6月8日
    00
  • React和Node.js快速上传进度条功能实现

    React和Node.js快速上传进度条功能实现 上传文件的进度条功能是现代Web应用程序中的常见需求。本文将介绍如何使用React和Node.js创建一个快速上传进度条。 前置条件 在学习具体的实现前,你需要掌握以下技能和知识: 掌握React基础知识和操作; 掌握Node.js和Express框架的基础知识; 掌握使用axios发送http请求; 掌握使…

    node js 2023年6月8日
    00
  • Egg.js 中 AJax 上传文件获取参数的方法

    Egg.js 作为一个基于 Node.js 的企业级开发框架,提供了很多便捷的 API 和插件。在实际开发中,我们很多时候需要使用上传文件的功能。本文将介绍在 Egg.js 中通过 AJAX 方式上传文件并获取参数的方法。 上传文件 在 Egg.js 中通过 AJAX 方式上传文件,可以使用 formidable 插件来解析文件。安装该插件只需要在终端执行一…

    node js 2023年6月8日
    00
  • Nodejs把接收图片base64格式保存为文件存储到服务器上

    下面是详细讲解Nodejs把接收图片base64格式保存为文件存储到服务器上的完整攻略,过程中包含两条示例说明。 1. 接收base64格式图片数据 在Nodejs中接收base64格式图片数据,可以使用request模块或者express框架的post方式接收。下面是使用express框架接收的示例代码: const express = require(‘…

    node js 2023年6月8日
    00
  • JS实现判断对象是否为空对象的5种方法

    以下是JS实现判断对象是否为空对象的5种方法的完整攻略: 方法一:for…in方法 使用for…in遍查对象中是否有属性,如果有则返回false,没有则返回true。 代码示例: function isEmptyObject(obj) { for(var key in obj) { return false; } return true; } con…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部