本文共 1611 字,大约阅读时间需要 5 分钟。
Node.js 的事件循环(Event Loop)是其非阻塞I/O和高并发能力的核心机制。它基于JavaScript的单线程异步执行模型,允许Node.js在不创建额外线程的情况下处理并发操作。特别是在I/O密集型任务中,事件循环展现出极高的效率。本文将详细解析事件循环的基本组成部分、工作流程,并通过简单示例帮助理解。
事件循环可以大致分为以下几个阶段:
setTimeout 和 setInterval 的回调。setImmediate 的回调。socket.on('close', ...) 这类关闭事件的回调。完成所有阶段后,事件循环会再次从Timers阶段开始,不断循环,直到没有更多的任务需要处理。
理解事件循环的执行顺序对于写出高效、可预测的Node.js应用至关重要。以下是一个简单示例,展示了 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
这是因为:
File read 在 setImmediate callback 之前打印。setTimeout 回调。setImmediate 回调。注意,实际的输出可能会因为Node.js版本、操作系统等因素略有不同,但基本原理不变。
转载地址:http://cpjfk.baihongyu.com/