Node.js Nodejs Bluebird Promise.map用于大型集合不起作用
我有一个拥有20000多个承诺的大型集合,我想使用Bluebird的Promise.map解决它。但是,我的代码没有成功执行,但在大约15-20分钟后超时 我得到的错误是超时错误 当集合少于2000个承诺时,代码将在不到10秒内成功执行 请帮助我找到Promise.map的替代方法或任何其他方法,以便代码不会超时Node.js Nodejs Bluebird Promise.map用于大型集合不起作用,node.js,promise,bluebird,Node.js,Promise,Bluebird,我有一个拥有20000多个承诺的大型集合,我想使用Bluebird的Promise.map解决它。但是,我的代码没有成功执行,但在大约15-20分钟后超时 我得到的错误是超时错误 当集合少于2000个承诺时,代码将在不到10秒内成功执行 请帮助我找到Promise.map的替代方法或任何其他方法,以便代码不会超时 service.getSomePromises().then(function(arrSomePromises){ var promises = []; for (v
service.getSomePromises().then(function(arrSomePromises){
var promises = [];
for (var i = 0;i < arrSomePromises.length; i++){
var getDetailsObject = _getDetails(_db, i);
promises.push(getDetailsObject);
}
//Below is the code that times out
return Promise.map(promises, function(doc){
return reportData.push(doc);
})
}
service.getSomePromissions().then(函数(arrsomePromissions){
var承诺=[];
for(var i=0;i
如果您遇到超时错误,那么您可能只是因为对某个主机的同时请求太多而使目标服务器无法承受。对于大量请求,您需要限制同时向同一主机发送的同时请求的数量。我建议一次最多5-10个然后,您可以尝试提高它,看看这是否真的提高了您的性能。目标服务器对一次可以有效服务所有请求的同时请求数量有限制。超过此限制只会加重基础结构的负担,最终只会导致超时错误
Bluebird的Promise.map()
在正确使用时(您没有这样做),有一个并发性
选项,可以告诉它您希望它一次使用的最大并发连接数。但是,要使用该选项,您必须在传递数据数组的地方正确使用Bluebird.map()(不是已启动异步操作的承诺数组)和返回对其中一个数据项进行操作的承诺的函数
下面是一个示例,说明如何正确使用concurrency
选项Promise.map()
let someLargeArrayOfData = [...];
Promise.map(someLargeArrayOfData, function(item) {
return request(item); // async function that returns promise
}, {concurrency: 10}).then(function(results) {
// results is an array of data from all the resolved promises
}).catch(function(err) {
// process error here
});
您可能尝试了太多的并发连接,这可能会耗尽本地资源,也可能会压倒目标。我建议对Promise.map()使用concurrency
选项
。首先将其设置为10之类的小值,如果可以的话,然后尝试提高它。此外,既然您已经添加了代码,这是使用Promise.map()的错误方法
。通常,向它传递一个数据数组和一个函数,该函数对该数据执行一些异步操作并返回一个承诺。您不会向它传递一个承诺数组。可以使用promise.all()
带有一系列承诺。您显示的代码没有任何意义,因为承诺。长度
为0
,因此您的for
循环将不会执行任何操作。对于错误的代码,我深表歉意。这是我编写并试图修改的较大代码的摘要。我现在已经修复了它。我听到您在使用并发操作我完全错过了。让我尝试一下,过一会儿再发布结果。非常感谢。感谢您的回复。我将尝试更新代码以处理数据数组,而不是承诺。但是,如果我有承诺数组,除了承诺之外,还有其他方法处理它们吗?@user2434285-承诺数组通常表示ts一组已经启动的异步操作。此时,除了它们何时完成之外,没有什么需要知道的了,Promise.all()
就是这样做的。您需要一个解决方案,它不会一次启动太多异步操作。