事件循环错误的执行顺序
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.readFile
。 stat
操作所花费的时间应该与文件大小无关。在那种情况下,在 my 机器上,我看到:
Timeout 1
File 1
Immediate 1
Timeout 2
... 这表明文件操作已在下一个滴答声中完成。但同样,不能保证会发生这种情况。如果文件的元数据不在缓存中,那么程序还需要等待内核从磁盘中获取元数据,这是一个比较慢的操作。
有趣的是,有时(可能每 10 次尝试一次)我会看到这个:
File 1
Immediate 1
Timeout 1
Timeout 2
这意味着 setTimeout(..., 0)
实际上不能保证在下一个报价单上执行。
我有这个非常简单的 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.readFile
。 stat
操作所花费的时间应该与文件大小无关。在那种情况下,在 my 机器上,我看到:
Timeout 1
File 1
Immediate 1
Timeout 2
... 这表明文件操作已在下一个滴答声中完成。但同样,不能保证会发生这种情况。如果文件的元数据不在缓存中,那么程序还需要等待内核从磁盘中获取元数据,这是一个比较慢的操作。
有趣的是,有时(可能每 10 次尝试一次)我会看到这个:
File 1
Immediate 1
Timeout 1
Timeout 2
这意味着 setTimeout(..., 0)
实际上不能保证在下一个报价单上执行。