单线程 eventLoop
• 异步任务是不会立即执行的事件任务。异步任务包括宏任务和微任务。
事件循环(Event Loop)是处理非阻塞异步操作的核心机制。事件循环主要由多个阶段组成,每个阶段负责处理不同类型的任务。以下是一个典型的事件循环包含的主要阶段:
简介:单线程还是使用方而言,内部io、网络还是多线程的
- Timers(定时器)
- 这个阶段处理所有的计时器事件,如
setTimeout
和setInterval
。 - 当前阶段的任务完成后,会检查是否有定时器到期,并执行相应的回调函数。
- I/O Callbacks(输入/输出回调)
- 处理与文件系统、网络等I/O相关的回调函数。
- 例如,
fs.readFile
、net.Server
上的连接事件等。
- Poll(轮询)
- 主要用于处理来自libuv的I/O事件。
- 在这个阶段,Node.js等待I/O操作的结果,并且准备将它们加入队列以便稍后处理。
- Check(检查)
- 在这个阶段,
setImmediate
回调被调用。 setImmediate
不同于setTimeout
,因为它是在当前事件循环的I/O回调之后,进入下一次事件循环之前执行。
- CloseCallbacks(关闭回调)
- 处理一些关闭资源的回调,如关闭TCP连接或关闭文件等。
此外,还有两个特殊的阶段:
- Prepare(准备)
- 这个阶段主要用于
async
资源,如http.ServerRequest
。 - 在这个阶段可以注册
setImmediate
回调。
- Finalization(最终化)
- 这里处理一些清理工作,如
finalization
钩子。
除了上述阶段之外,还存在微任务(Microtasks)的概念。微任务包括:
process.nextTick
回调
- Promise的
.then()
和.catch()
方法中的回调
MutationObserver
(不适用于Node.js)
QueueMicrotask()
一个 Node.js 程序结束时,Node.js 会检查 event loop 是否在等待异步 I/O 操作结束,是否在等待计时器触发,如果没有,就会关掉 event loop。
微任务是在当前宏任务结束后立即执行的,但在控制权传递给下一个宏任务之前。这意味着微任务具有比大多数宏任务更高的优先级。
Loading...