You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,请问:

  1. 这些读取操作是否并发执行?
  2. 回调是否会按完成顺序(text3→text2→text1)进入poll阶段并被调用,还是会同步处理每个读取操作再添加回调?

回答

  • 读取操作是并发执行的
    Node.js的fs.readFile属于异步IO操作,调用该方法时,主线程会将读取任务提交给libuv管理的线程池,随后立即继续执行后续代码,不会等待当前读取完成。三个fs.readFile调用会在极短时间内依次提交三个独立的读取任务到线程池,这三个任务会在后台并行执行,各自的耗时互不影响。

  • 回调会按完成顺序进入Poll阶段并被调用
    具体流程如下:

    1. 当某个文件读取完成后,处理该任务的IO线程会将对应的回调函数添加到事件循环的Poll队列中;
    2. 事件循环进入Poll阶段时,会依次执行队列中的所有回调任务;
    3. 由于text3耗时最短(100ms),它的回调会最先被加入Poll队列,接着是text2(200ms),最后是text1(300ms);
    4. 主线程在Poll阶段会严格按照队列顺序执行回调,因此控制台输出顺序必然是text3 finished→text2 finished→text1 finished。

需要注意的是:调用fs.readFile的过程是同步的(主线程依次提交三个任务),但真正的文件读取工作是在后台线程池并发进行的,主线程不会被阻塞。


内容的提问来源于stack exchange,提问作者lewislin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:19