gpt4 book ai didi

javascript - 在运行时处理 50k 个网页 (NodeJS)

转载 作者:搜寻专家 更新时间:2023-11-01 00:29:17 25 4
gpt4 key购买 nike

我需要下载约 50k 个网页,从中获取一些数据并将其放入变量。

我将每个请求包装到 Promise 中,然后 Promise.all() 它们。我使用 Request 库。

简化代码:

const request = require('request');
const urls = [url1, url2, ...];
const promises = [];

urls.forEach(url => {
promises.push((resolve, reject) => {
request(url, (error, response, body) => {
if(error){ reject(error); return; }

// do something with page

resolve(someData);
});
});
});

Promise.all(promises.map(pr => new Promise(pr)))
.then((someDataArray)=>{ /* process data /* });

但是我收到ENFILE 异常,这代表系统中打开的文件太多(在我的桌面上,打开文件的最大数量是 2048)。

我知道 Promise 在创建时执行,但我无法解决这个问题。

也许还有其他方法可以做到这一点?感谢您的回复。

最佳答案

您想要的是启动 N 个请求,然后在一个请求完成时启动一个新请求(无论成功与否)。

为此有很多库,但重要的是能够自己实现这种限制:

const request = require('request');
const urls = [url1, url2, ...];
const MAX_QUERIES = 10;
var remaining = urls.length;

const promises = [];

function startQuery(url){
if (!url) return;
request(url, (error, response, body) => {
if (error) // handle error
else // handle result
startQuery(urls.shift());
if (--remaining==0) return allFinished();
});
}

for (var i=0; i<MAX_QUERIES; i++) startQuery(urls.shift());

function allFinished(){
// all done
}

关于javascript - 在运行时处理 50k 个网页 (NodeJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43869080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com