Node.js多文件fs.readFile是否并发?poll阶段回调执行顺序疑问
Node.js事件循环Poll阶段与多文件读取的协作机制疑问
我正在学习Node.js异步架构,想了解事件循环poll阶段与多文件读取的协作机制。现有如下代码:
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需300ms、text2需200ms、text3需100ms,请问:
- 这些读取操作是否并发执行?
- 回调是否会按完成顺序(text3→text2→text1)进入poll阶段并被调用,还是会同步处理每个读取操作再添加回调?
回答
读取操作是并发执行的
Node.js的fs.readFile属于异步IO操作,调用该方法时,主线程会将读取任务提交给libuv管理的线程池,随后立即继续执行后续代码,不会等待当前读取完成。三个fs.readFile调用会在极短时间内依次提交三个独立的读取任务到线程池,这三个任务会在后台并行执行,各自的耗时互不影响。回调会按完成顺序进入Poll阶段并被调用
具体流程如下:- 当某个文件读取完成后,处理该任务的IO线程会将对应的回调函数添加到事件循环的Poll队列中;
- 事件循环进入Poll阶段时,会依次执行队列中的所有回调任务;
- 由于text3耗时最短(100ms),它的回调会最先被加入Poll队列,接着是text2(200ms),最后是text1(300ms);
- 主线程在Poll阶段会严格按照队列顺序执行回调,因此控制台输出顺序必然是
text3 finished→text2 finished→text1 finished。
需要注意的是:调用fs.readFile的过程是同步的(主线程依次提交三个任务),但真正的文件读取工作是在后台线程池并发进行的,主线程不会被阻塞。
内容的提问来源于stack exchange,提问作者lewislin
相关产品推荐
相关产品推荐

