成为一名老 noder - Nodejs 深入理解 Event Loop
成为一名老 noder - Nodejs 深入理解 Event Loop
身为一名老 noder, 我们都知道, nodejs 程序写得好不好, 就看对 eventloop 理解得到不到位.
下面这段代码输出是多少呢?
setTimeout(function () {
setTimeout(function timeout () {
console.log('1');
},0);
setImmediate(function immediate () {
console.log(‘2’);
});
}, 0);
setImmediate(function () {
setTimeout(function timeout () {
console.log(‘3’);
},0);
setImmediate(function immediate () {
console.log(‘4’);
});
});
cliche
setTimeout 与 setImmediate 之间的区别
process.nextTick 与 setImmediate 之间的区别
何时需要使用 process.nextTick
promise 在 eventloop 中的定位
单线程的 nodejs
当我们在说单线程 nodejs 时, 其实是在说我们写的 nodejs 代码的执行是单线程的.
实际上, nodejs 程序在运行时自己维护了一个线程池. 垃圾回收任务就是在单独的线程里执行的.
成为一名老练的 Node.js 开发者,深入理解 Event Loop 是必经之路。Event Loop 是 Node.js 异步编程模型的核心,它使得 Node.js 能够高效地处理非阻塞 I/O 操作。
Event Loop 的基本原理
Node.js 的 Event Loop 基于 libuv 库实现,其工作流程大致如下:
-
事件循环的阶段:
- Timers 阶段:执行已经设置的
setTimeout()
和setInterval()
回调。 - I/O Callbacks 阶段:执行一些上一轮未完成的 I/O 回调。
- Idle, Prepare 阶段:仅供内部使用。
- Poll 阶段:获取新的 I/O 事件;如果有回调需要执行,则执行回调。
- Check 阶段:执行
setImmediate()
回调。 - Close Callbacks 阶段:执行一些关闭的回调函数,如
socket.on('close', ...)
。
- Timers 阶段:执行已经设置的
-
代码示例:
console.log('Start');
setTimeout(() => {
console.log('setTimeout');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
console.log('End');
// 输出顺序:Start, End, setImmediate, setTimeout
上述代码展示了 setTimeout
和 setImmediate
在 Event Loop 中的执行顺序,体现了不同阶段的优先级。
总结
深入理解 Event Loop,不仅能帮助你编写出更高效的 Node.js 代码,还能更好地调试和解决异步编程中的常见问题。建议阅读 Node.js 官方文档和 libuv 的相关资料,以获得更详细的信息。