Node.js事件循环(Event Loop)的使用

 更新时间:2024年05月17日 10:33:45   作者:还是大剑师兰特  
事件循环是其非阻塞I/O和高并发能力的核心机制,本文主要介绍了Node.js事件循环(Event Loop)的使用,具有一定的参考价值,感兴趣的可以了解一下

在这里插入图片描述

Node.js 的事件循环(Event Loop)是其非阻塞I/O和高并发能力的核心机制,它基于JavaScript的单线程异步执行模型。事件循环允许Node.js在不创建额外线程的情况下处理并发操作,特别是对于I/O密集型任务非常有效。以下是事件循环的基本组成部分和工作流程,以及一个简单示例来帮助理解。

一、事件循环阶段

事件循环可以大致分为以下几个阶段:

  • Timers(定时器):处理setTimeoutsetInterval的回调。
  • I/O Polling(I/O轮询):检查是否有已完成的I/O操作,如文件读写、网络请求等,如果有,则执行相应的回调。
  • Idle, Prepare(空闲、准备):内部操作,对外部透明。
  • Check(检查):处理setImmediate的回调。
  • Close Callbacks(关闭回调):处理如socket.on('close', ...)这类关闭事件的回调。

完成所有阶段后,事件循环会再次从Timers阶段开始,不断循环,直到没有更多的任务需要处理。

二、循环示例代码

下面的示例代码演示了setTimeoutsetImmediate在事件循环中的执行顺序,帮助理解它们之间的区别。

const fs = require('fs');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);

async function main() {
  console.log('Start');

  // 使用setTimeout模拟定时器任务
  setTimeout(() => {
    console.log('setTimeout callback');
  }, 0);

  // 使用setImmediate模拟立即执行但排队在I/O之后的任务
  setImmediate(() => {
    console.log('setImmediate callback');
  });

  // 模拟一个I/O操作
  try {
    await readFile('test.txt', 'utf8');
    console.log('File read');
  } catch (err) {
    console.error(err);
  }

  console.log('End of main function');
}

main();

三、输出分析

假设test.txt文件存在且读取成功,可能的输出如下:

Start
End of main function
File read
setImmediate callback
setTimeout callback

这是因为:

  • Start首先打印。
  • setTimeout虽然设置了0延迟,但它仍会被放入Timers队列,不会立即执行。
  • setImmediate被安排在Check阶段执行。
  • readFile是一个I/O操作,事件循环会先进入I/O Polling阶段,等待该操作完成,因此File readsetImmediate callback之前打印。
  • End of main function紧接着主函数执行完毕后打印,此时事件循环有机会处理Timers队列中的setTimeout回调。
  • 由于没有其他I/O操作正在进行,事件循环继续进行,处理Check阶段的setImmediate回调。

注意,实际的输出可能会因为Node.js版本、操作系统等因素略有不同,但基本原理不变。理解事件循环对于写出高效、可预测的Node.js应用至关重要。

到此这篇关于Node.js事件循环(Event Loop)的使用的文章就介绍到这了,更多相关Node.js 事件循环内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Node.js进行CSV、JSON以及Excel的数据处理

    基于Node.js进行CSV、JSON以及Excel的数据处理

    在实际业务开发中,数据往往以多种文件格式存在,例如 CSV、JSON 和 Excel,这些格式广泛应用于数据导入导出、报表生成、系统对接以及批量处理任务中,Node.js 凭借丰富的第三方库和良好的异步能力,非常适合进行各类结构化数据的处理,需要的朋友可以参考下
    2025-12-12
  • Nodejs把接收图片base64格式保存为文件存储到服务器上

    Nodejs把接收图片base64格式保存为文件存储到服务器上

    这篇文章主要介绍了Nodejs把接收图片base64格式保存为文件存储到服务器上,文中代码较简短,需要的朋友可以参考下
    2018-09-09
  • 在Node.js中实现后端与前端的交互的方法详解

    在Node.js中实现后端与前端的交互的方法详解

    在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高, 所以本文给大家介绍了在Node.js中实现后端与前端的交互的方法,需要的朋友可以参考下
    2024-09-09
  • nodejs如何获取当前连接的网络ip

    nodejs如何获取当前连接的网络ip

    这篇文章主要介绍了nodejs如何获取当前连接的网络ip问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 使用node.js搭建服务器

    使用node.js搭建服务器

    最近需要完成一个课程设计,被项目经理(组长)分配写界面功能,下面小编通过本文给大家分享使用使用node搭建小型服务器的方法,需要的朋友参考下
    2017-05-05
  • Node.js事件的正确使用方法

    Node.js事件的正确使用方法

    这篇文章主要给大家介绍了关于Node.js事件的正确使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Node.js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • node工作线程worker_threads的基本使用

    node工作线程worker_threads的基本使用

    本文主要介绍了node工作线程worker_threads的基本使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Node.js中JavaScript操作MySQL的常用方法整理

    Node.js中JavaScript操作MySQL的常用方法整理

    这篇文章主要介绍了Node.js中JavaScript操作MySQL的常用方法整理,包括作者对使用MySQL模块连接池时错误解决的一个记录,需要的朋友可以参考下
    2016-03-03
  • 深入理解Node.js中CORS的三个重要响应头

    深入理解Node.js中CORS的三个重要响应头

    CORS是一种安全机制,通过配置适当的响应头,服务器可以允许或限制外部域对资源的访问,本文主要介绍了Node.js中CORS的三个重要响应头,感兴趣的可以了解一下
    2024-12-12
  • node.js基础知识小结

    node.js基础知识小结

    本文给大家汇总介绍了学习node.js的一些关于开发环境的基础知识,非常简单,给新手们参考下
    2018-02-02

最新评论