事件循环错误的执行顺序

Event loop wrong order of execution

我有这个非常简单的 Nodejs 示例来理解事件循环

setTimeout(function() {
   console.log("Timeout 1");
}, 0);

fs.readFile("test-file-empty.txt", () => {
   console.log("File 1");
});

setTimeout(function() {
   console.log("Timeout 2");
}, 100);

setImmediate(function() {
   console.log("Immediate 1");
});

这给出了以下输出

Timeout 1
Immediate 1
File 1
Timeout 2

根据我对事件循环的理解,这些应该是 ticks 或以上示例的循环:

第一个打勾:

Timeout 1
File 1
Immediate 1

第二次勾选:

Timeout 2

1) 刻度数和分量有误请指正

2) 为什么 setImmediate 回调在 fs.readFile I/O 回调之前执行,即使 setImmediate 应该 运行 在随后的检查阶段轮询阶段(处理 I/O 回调)?注意:文本文件是空的顺便说一下,所以应该立即执行

书中没有说明 I/O 操作需要多长时间。假设零字节文件位于网络驱动器上。您仍然需要考虑网络的延迟,因此在这种情况下您甚至可能会看到

Timeout 1
Immediate 1
Timeout 2
File 1

我将您的程序更改为使用 fs.stat 而不是 fs.readFilestat 操作所花费的时间应该与文件大小无关。在那种情况下,在 my 机器上,我看到:

Timeout 1
File 1
Immediate 1
Timeout 2

... 这表明文件操作已在下一个滴答声中完成。但同样,不能保证会发生这种情况。如果文件的元数据不在缓存中,那么程序还需要等待内核从磁盘中获取元数据,这是一个比较慢的操作。


有趣的是,有时(可能每 10 次尝试一次)我会看到这个:

File 1
Immediate 1
Timeout 1
Timeout 2

这意味着 setTimeout(..., 0) 实际上不能保证在下一个报价单上执行。