我正在阅读更多关于Node中异步架构的资料,我需要一些帮助来理解事件循环中的poll阶段是如何处理多个文件读取的,假设我有一些. txt文件需要程序读取:
import * as fs from 'node:fs';
let text1 = './file1.txt';
let text2 = './file2.txt';
let text3 = './file3.txt';
function readMyFiles() {
fs.readFile(text1, () => console.log('text1 finished'))
fs.readFile(text2, () => console.log('text2 finished'))
fs.readFile(text3, () => console.log('text3 finished'))
}
readMyFiles();
再假设读取text1
需要300毫秒,读取text2
需要200毫秒,读取text3
需要100毫秒。当操作排队时,它们是否都同时运行?如果是,回调是否会被置于poll阶段,并按照它们完成的顺序调用(text3回调,然后text2回调,然后text1回调)?还是每个文件读取操作都是同步处理的,然后添加它们的回调?(text1回调在300毫秒后调用,text2在200毫秒后调用,然后text3回调在100毫秒后调用)
谢谢你。
1条答案
按热度按时间gudnpqoy1#
I/O操作不排队,节点将它们转发给操作系统。
大多数操作系统都是多线程的,在这种情况下,I/O操作会在节点之外同时运行。
每次I/O操作完成时,操作系统都会通知节点,然后节点会将相应的回调排队,以便在节点事件循环的下一个轮询阶段执行。
因此,在您的代码中,回调是按照它们被添加到轮询队列的顺序执行的,也就是它们各自的异步函数在操作系统内核中完成运行的顺序。