我正在开发一个可以进行数千次并发https调用的项目。 我的第一个问题是:并存限制在哪里?可以同时拨打多少电话?它取决于什么? 其次,我在ubuntu系统上工作,在大多数情况下,由于请求太多,系统挂起。如何将这些数千个并发请求一次分成50或100个请求的块,并在完成这些请求后,调用下一组请求。
我的代码如下:
items.forEach(function(item) {
request().then(function() {
if(counter == items.length) {
deferred.resolve("Success");
return deferred.promise;
}
})
.catch(function(err) {
deferred.reject(err);
});
counter++;
});
Items数组大多超过10k。
答案 0 :(得分:2)
您可以在bluebird中使用Promise.map并发选项
var Promise = require("bluebird");
var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
var concurrency = parseFloat(process.argv[2] || "Infinity");
console.time("reading files");
fs.readdirAsync(".").map(function(fileName) {
var stat = fs.statAsync(fileName);
var contents = fs.readFileAsync(fileName).catch(function ignore() {});
return join(stat, contents, function(stat, contents) {
return {
stat: stat,
fileName: fileName,
contents: contents
}
});
// The return value of .map is a promise that is fulfilled with an array of the mapped values
// That means we only get here after all the files have been statted and their contents read
// into memory. If you need to do more operations per file, they should be chained in the map
// callback for concurrency.
}, {concurrency: concurrency}).call("sort", function(a, b) {
return a.fileName.localeCompare(b.fileName);
}).then(function() {
console.timeEnd("reading files");
});
答案 1 :(得分:1)
并发限制在哪里?
首先,您的所有请求将进入event loop,然后逐个进入callstack。所以没有实际限制,当callstack开始填充越来越多的项目时,它将开始吃你的RAM。
可以同时进行多少次通话?
您可以使用系列和并行模型 -
您可以在一个插槽中发送50(任意号码)请求,然后在另一个插槽中发送,等等。
要进行系列和并行请求,您可以分别使用async series和async parallel。
取决于什么?
观看我在第一个回答中提到的链接。