成为一名老 noder - Nodejs 深入理解 Event Loop

发布于 1周前 作者 ionicwang 来自 nodejs/Nestjs

成为一名老 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 程序在运行时自己维护了一个线程池. 垃圾回收任务就是在单独的线程里执行的.

more...


1 回复

成为一名老练的 Node.js 开发者,深入理解 Event Loop 是必经之路。Event Loop 是 Node.js 异步编程模型的核心,它使得 Node.js 能够高效地处理非阻塞 I/O 操作。

Event Loop 的基本原理

Node.js 的 Event Loop 基于 libuv 库实现,其工作流程大致如下:

  1. 事件循环的阶段

    • Timers 阶段:执行已经设置的 setTimeout()setInterval() 回调。
    • I/O Callbacks 阶段:执行一些上一轮未完成的 I/O 回调。
    • Idle, Prepare 阶段:仅供内部使用。
    • Poll 阶段:获取新的 I/O 事件;如果有回调需要执行,则执行回调。
    • Check 阶段:执行 setImmediate() 回调。
    • Close Callbacks 阶段:执行一些关闭的回调函数,如 socket.on('close', ...)
  2. 代码示例

console.log('Start');

setTimeout(() => {
  console.log('setTimeout');
}, 0);

setImmediate(() => {
  console.log('setImmediate');
});

console.log('End');

// 输出顺序:Start, End, setImmediate, setTimeout

上述代码展示了 setTimeoutsetImmediate 在 Event Loop 中的执行顺序,体现了不同阶段的优先级。

总结

深入理解 Event Loop,不仅能帮助你编写出更高效的 Node.js 代码,还能更好地调试和解决异步编程中的常见问题。建议阅读 Node.js 官方文档和 libuv 的相关资料,以获得更详细的信息。

回到顶部