感到fs.readFile`的结果很奇怪,IO在NodeJS线程池中工作

问题描述 投票:0回答:1

我生成了许多内容相同且大小为150M的文件。我使用fs.readFile异步API像这样读取它们:

const fs = require('fs');
const COUNT = 16;

for (let i = 1; i <= COUNT; ++i) {
    console.time(i);
    console.log(process.hrtime());
    fs.readFile(`a${i}`, (err, data) => {
        console.log(process.hrtime());
        console.timeEnd(i);
    });
}

我将ENV变量UV_THREADPOOL_SIZE设置为1,然后将COUNT更改为8、16,甚至更改为128。但是回调似乎几乎是在同一时间触发的。对于128,时间大于4s。

我只测试了1个文件,大约需要60毫秒的时间。该屏幕截图是8个文件的结果:

enter image description here

在我的内存中,异步fs.readFile API由线程池处理。因此,我将池大小更改为1。

并且在NodeJS事件循环中,轮询阶段将处理IO事件并为其执行回调。我忘记了轮询阶段将阻塞事件循环多长时间。但我猜不到4秒。

因此,对于上面的代码,由于轮询大小为1,我想我们将一张一张地读取所有文件,对吗?如果读取了一个文件,则回调将在下一个轮询阶段执行(对于128个文件,时间将超过4s,所以我猜将会有一个下一个轮询阶段)。然后我们将在控制台中获得时间。

但是我不理解输出。似乎回调几乎同时触发。

我是否对事件循环中的轮询阶段或线程池有所了解?

node.js callback threadpool fs event-loop
1个回答
0
投票

使用util软件包并尝试“ var util = require('util');”

© www.soinside.com 2019 - 2024. All rights reserved.