为什么 Node.js setImmediate 在 I/O 回调之后执行?

2023-12-20

作为新成员,我无法对主题发表评论,这就是为什么我必须创建一个新主题。但通过这种方式,我可以澄清问题,所以希望你们能帮助我。

我读过很多关于 Node.js 事件循环的文章。我根据以下材料形成了对它的理解:

Node.js 事件循环 https://jsblog.insiderattack.net/timers-immediates-and-process-nexttick-nodejs-event-loop-part-2-2c53fd511bb3
事件循环到底是什么? https://www.youtube.com/watch?v=8aGhZQkoFbQ
为什么 Node Js 事件循环中的 setImmediate() 在 fs.readFile() 之前执行? https://stackoverflow.com/a/47727402/9138253

(请随意推荐其他内容丰富且准确的材料)

尤其是第三个环节,让我有了更深的理解。但请记住这一点,我无法理解以下代码的事件循环行为:

var fs = require('fs');
var pos = 0;

fs.stat(__filename, function() {
 console.log(++pos + " FIRST STAT");
});

fs.stat(__filename, function() {
 console.log(++pos + " LAST STAT");
});

setImmediate(function() {
 console.log(++pos + " IMMEDIATE")
})

console.log(++pos + "LOGGER");

令人惊讶的是,对我来说输出如下:

LOGGER  
FIRST STAT  
LAST STAT  
IMMEDIATE

我的终端的屏幕截图,显示输出以及节点版本 https://i.stack.imgur.com/PqDkr.png
在线代码编译器 rextester.com 输出的屏幕截图 https://i.stack.imgur.com/u2tRw.png

保持事件循环Diagram https://i.stack.imgur.com/6zsY7.jpg考虑到,我想流程应该如下:

  1. Interpreter首先启动了两个stat操作。
  2. 解释器将 setImmedate 回调(事件)放入 setImmedate 队列中
  3. 调用堆栈记录记录器
  4. I/O Poll 阶段之前的所有事件队列都是空的,因此 Event Loop(EL) 继续进行
  5. 在 I/O 轮询阶段,EL 收集事件并将 fs.stat 回调排入“运行已完成的 I/O 处理程序”阶段
  6. EL检查Check阶段,并运行setImmediate回调
  7. 本轮EL结束,第二轮开始
  8. 在“运行已完成的 I/O 处理程序”中,EL 运行两个回调(它们的顺序是不确定的)

问题 1:我的分析/预测哪部分是错误的?

问题 2:事件循环在什么时候开始工作?它是从应用程序的开头(即第 1 阶段)开始的吗?或者一旦解释器读取整个代码,所有同步任务都在调用堆栈中完成,并且调用堆栈需要更多任务(即在阶段 3-4 之间),它就开始吗?

提前致谢,


setImmediate = 立即执行,无需等待任何 I/O

In https://nodejs.org/docs/v8.9.3/api/timers.html#timers_setimmediate_callback_args https://nodejs.org/docs/v8.9.3/api/timers.html#timers_setimmediate_callback_args says:

安排回调的“立即”执行afterI/O 事件的回调。返回立即数以与clearImmed一起使用

Steps:

  1. 第一个统计数据的回调在 I/O 队列中排队
  2. 最后统计数据的回调在 I/O 队列中排队
  3. 立即回调在立即队列中排队
  4. LOGGER
  5. 如果 I/O 操作(1 和 2 中)完成,则 1 和/或 2 中的回调被标记为准备执行
  6. Execute the ready callbacks one by one (first timmer, then I/O, finally immediates). In your case:
    1. 第一个统计数据
    2. 最后统计
    3. LOGGER

如果 I/O 未结束于5.那么 LOGGER 在 FIRST STAT 和 LAST STAT 之前执行。

也可以看看:https://jsblog.insiderattack.net/timers-immediates-and-process-nexttick-nodejs-event-loop-part-2-2c53fd511bb3#f3dd https://jsblog.insiderattack.net/timers-immediates-and-process-nexttick-nodejs-event-loop-part-2-2c53fd511bb3#f3dd

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Node.js setImmediate 在 I/O 回调之后执行? 的相关文章

随机推荐