如果我将fs.readFile传递给多个文件,它们是否同时被读取,然后在Node中完成时调用其附加的回调函数?

5vf7fwbs  于 2023-03-01  发布在  Node.js
关注(0)|答案(1)|浏览(158)

我正在阅读更多关于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毫秒后调用)
谢谢你。

gudnpqoy

gudnpqoy1#

I/O操作不排队,节点将它们转发给操作系统。
大多数操作系统都是多线程的,在这种情况下,I/O操作会在节点之外同时运行。
每次I/O操作完成时,操作系统都会通知节点,然后节点会将相应的回调排队,以便在节点事件循环的下一个轮询阶段执行。
因此,在您的代码中,回调是按照它们被添加到轮询队列的顺序执行的,也就是它们各自的异步函数在操作系统内核中完成运行的顺序。

相关问题