问题描述
const request = require('request');
const urls = [];
var start = Date.Now();
var count = 1;
var countUrls = urls.length;
var up= 0
var down = 0;
function callback(start) {
console.log((Date.Now() - start) + 'ms execution.');
console.log('\n Up: ' + up + ' Down: ' + down);
process.exit()
}
urls.forEach( function(url) {
var options = {
url: url,timeout: 10000
};
request(options,function (error,response,body) {
if(error) {
console.error(count + ': ' + url + ' is down: ' + error);
count++;
down++;
} else {
console.log(count + ': ' + url + ' is up: ');
count++;
up++;
}
if((count - 1) == countUrls) {
callback(start);
}
});
});
它工作得很好。在我的 urls 数组中,我有 120 个 URL。当我运行此代码时,它会在 20-30 秒内自行执行。但是如果我将 o URLs 的数量增加到 720,执行时间会增加到 1 分 30 秒。
我想了解两件事;
1- 超时设置为 10 秒。即使有 120 个网址,它怎么能超越这个范围?
2- 此代码不需要良好的硬件,它只是连接到网站。我能做些什么来加快速度?我想在 1 分钟内检查大量的 URL(可能是 100k),因为我的代码每分钟都会运行一次。
仅供参考,此代码在我的本地机器上运行,我有 24 MBPS 的互联网连接。这可能是问题所在,但大多数服务器都有 1 GBPS 的互联网连接,当我比较 24 - 1 和 120 - 100k 时,我觉得这还不够。
解决方法
您可以尝试使用 Promise.all(),它将并行启动所有请求(而不是您当前正在执行的顺序操作)。
Promise.all([promise1,promise2,promise3]).then((values) => {
console.log(values);
});
数组中的每个元素都对应于您网站的 URL(或至少是请求)。
您可能会在并行启动 100,000 个请求时遇到问题 - 但之后只需编写代码即可。
如果其中一个失败,您自然需要考虑错误处理,但简而言之,这就是您需要关注的。