我有一个脚本,可以从服务器下载数千个文件,对这些文件执行一些 CPU 密集型计算,然后将结果上传到某个地方。作为一个附加级别的复杂性,我想限制与我正在下载文件的服务器的并发连接数。
为了让 CPU 密集型计算脱离事件线程,我利用了 josdejong 的 workerpool。我还想我可以利用这样一个事实,即在任何给定时间只会启动有限数量的线程来限制与我的服务器的并发连接数,所以我尝试将网络 I/O 放在工作进程中,例如所以(打字稿):
import Axios from "axios";
import workerpool from "workerpool";
const pool = workerpool.pool({
minWorkers: "max",
});
async function processData(file: string) {
console.log("Downloading " + file);
const csv = await Axios.request<IncomingMessage>({
method: "GET",
url: file,
responseType: "stream"
});
console.log(csv);
// TODO: Will process the file here
}
export default async function (files: string[]) {
const promiseArray: workerpool.Promise<Promise<void>>[] = [];
// Only processing the first file for now during testing
files.slice(0, 1).forEach((file) => {
promiseArray.push(pool.exec(processData, [file]));
});
await Promise.allSettled(promiseArray);
await pool.terminate();
}
当我编译并运行此代码时,我看到消息“正在下载 test.txt”,但之后我看不到以下日志语句 ( console.log(csv)
)
我已经尝试对此代码进行各种修改,包括删除responseType
、删除await
和仅检查Promise
Axios 返回的、使函数非异步等。不管它似乎总是Axios.request
在线崩溃
工作线程是否无法打开 HTTP 连接或其他什么?还是我只是犯了一个愚蠢的错误?