本文共 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密集型任务非常有效。以下是事件循环的基本组成部分和工作流程,以及一个简单示例来帮助理解。
事件循环可以大致分为以下几个阶段:
setTimeout和setInterval的回调。setImmediate的回调。socket.on('close', ...)这类关闭事件的回调。完成所有阶段后,事件循环会再次从Timers阶段开始,不断循环,直到没有更多的任务需要处理。
下面的示例代码演示了setTimeout、setImmediate在事件循环中的执行顺序,帮助理解它们之间的区别。
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 read在setImmediate callback之前打印。End of main function紧接着主函数执行完毕后打印,此时事件循环有机会处理Timers队列中的setTimeout回调。setImmediate回调。注意,实际的输出可能会因为Node.js版本、操作系统等因素略有不同,但基本原理不变。理解事件循环对于写出高效、可预测的Node.js应用至关重要。
转载地址:http://cpjfk.baihongyu.com/