博客
关于我
Node.js 的事件循环(Event Loop)详解
阅读量:793 次
发布时间:2023-02-16

本文共 1852 字,大约阅读时间需要 6 分钟。

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述

No. 大剑师精品GIS教程推荐
0 地图渲染基础- - -
1 Openlayers -
2 Leaflet -
3 MapboxGL -
4 Cesium -
5 threejs -
6 Shader 编程
7 Geoserver
8 卫星应用开发教程
9 GIS数字孪生与大模型
10 报表与数字大屏 - -

文章目录


在这里插入图片描述

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

一、事件循环阶段

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

  1. Timers(定时器):处理setTimeoutsetInterval的回调。
  2. I/O Polling(I/O轮询):检查是否有已完成的I/O操作,如文件读写、网络请求等,如果有,则执行相应的回调。
  3. Idle, Prepare(空闲、准备):内部操作,对外部透明。
  4. Check(检查):处理setImmediate的回调。
  5. 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文件存在且读取成功,可能的输出如下:

StartEnd of main functionFile readsetImmediate callbacksetTimeout 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应用至关重要。

转载地址:http://cpjfk.baihongyu.com/

你可能感兴趣的文章
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 源码完全注释(11)ngx_spinlock
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的 SSL 模块安装
查看>>
Nginx 的优化思路,并解析网站防盗链
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>
nginx 禁止以ip形式访问服务器
查看>>
Nginx 结合 consul 实现动态负载均衡
查看>>
Nginx 负载均衡与权重配置解析
查看>>
Nginx 负载均衡详解
查看>>