Node.js Event Loop各阶段讲解

yizhihongxing

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 js 2023年6月8日
    00
  • express框架+bootstrap美化ejs模板实例分析

    下面我将为你详细讲解“express框架+bootstrap美化ejs模板实例分析”的完整攻略。 一、概述 Express框架是Node.js项目开发的常用框架之一,它提供了一个简单、灵活的Web应用程序开发框架,可以帮助你快速搭建自己的Web应用。Bootstrap是一套优秀的前端框架,它包括了HTML、CSS以及JavaScript工具,可以非常方便地用…

    node js 2023年6月8日
    00
  • 详解node.js中的npm和webpack配置方法

    为了讲解“详解node.js中的npm和webpack配置方法”的完整攻略,我将分成以下几个部分: node.js中的npm webpack配置方法 示例说明 1. node.js中的npm npm是Node.js的软件包管理器,具有依赖解决方案,版本控制和包发布的功能。npm可以用来安装、发布和管理Node.js模块。它也是开发前端项目的必备工具。 以下是…

    node js 2023年6月8日
    00
  • Node.js搭建小程序后台服务

    Node.js搭建小程序后台服务 Node.js是一种基于Chrome V8引擎的JavaScript运行环境,具有高效、轻便的特点。它的出现为JavaScript语言在服务器端的应用提供了一种全新的解决方案。本篇文章将详细讲解使用Node.js搭建小程序后台服务的完整攻略。 安装Node.js 在开始操作之前,首先需要安装Node.js。可以到 Node.…

    node js 2023年6月8日
    00
  • Node.js 内置模块fs文件系统操作示例详解

    Node.js 内置模块fs文件系统操作示例详解 简介 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 内置了许多实用的模块,其中 fs 模块是常用的文件系统操作模块。 在本文中,我们将详细讲解 Node.js 内置模块 fs…

    node js 2023年6月8日
    00
  • Node.js node-schedule定时任务隔多少分钟执行一次的方法

    下面是详细讲解Node.js中node-schedule定时任务隔多少分钟执行一次的方法的完整攻略。 1. 安装node-schedule 在Node.js中使用node-schedule来实现定时任务,需要先安装node-schedule模块。使用以下命令进行安装: npm install node-schedule 2. 创建定时任务 安装完成node-…

    node js 2023年6月8日
    00
  • Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例

    针对Node.js微信 access_token (jsapi_ticket) 存取与刷新的示例,我们可以按照以下步骤进行攻略: 第一步:获取access_token和jsapi_ticket 我们可以通过以下方式获取微信公众平台的access_token和jsapi_ticket: 获取access_token const request = requir…

    node js 2023年6月8日
    00
  • 使用imba.io框架得到比 vue 快50倍的性能基准

    使用imba.io框架得到比vue快50倍的性能基准是基于一个开源项目的比较得出的结论。下面是如何进行该测试的攻略: 1. 准备工作 首先,需要确保计算机上已经安装了Node.js和NPM。然后,在命令行中运行以下命令来安装依赖项: npm install -g vue-cli npm install -g imba 这将安装Vue和Imba的命令行工具。 …

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