Javascript 承诺队列中的Bluebird队列并发性未按预期工作
我正在使用via NodeJS将HTTP端点作为任务排队。每个任务都有一个3级承诺依赖性,必须在完成之前解决 一项任务Javascript 承诺队列中的Bluebird队列并发性未按预期工作,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我正在使用via NodeJS将HTTP端点作为任务排队。每个任务都有一个3级承诺依赖性,必须在完成之前解决 一项任务 GET -> endpoint 1 // returns promise GET -> other endpoints in async // returns promise POST -> final endpoint // return promise 我使用queue.add()将其中20000个任务放入bluebird队列,然
GET -> endpoint 1 // returns promise
GET -> other endpoints in async // returns promise
POST -> final endpoint // return promise
我使用queue.add()
将其中20000个任务放入bluebird队列,然后调用queue.start()
。捕获所有错误,处理程序解析承诺
,以便完成任务
我已将并发设置为50。我最初的期望是,队列将在任何给定时间处理50个,但它会等待前50个完成,然后再开始下一个50个
不幸的是,其中一些请求可能需要10秒才能完成——如果单个请求需要更长的时间才能完成,整个队列将暂停,直到承诺得到解决
如果这是预期的行为,我可以做什么/使用什么来确保队列中的任务在任何给定时间最多处理50个任务,而不是每次50个任务
以下是我的配置设置:
var Queue = require('bluebird-queue'),
queue = new Queue({
concurrency: 50,
delay: 10, // ms
interval: 1 // ms not quite sure what this means
});
非常感谢您的帮助。在阅读了
蓝鸟队列的代码之后,您看到的关于并发性的行为似乎是预期的。我同意这有点令人惊讶。似乎没有任何方法可以获得所需的行为
我建议试试。根据对代码的快速阅读,它似乎会像您预期的那样工作。您应该在蓝鸟队列
上发布一个问题,该问题不是由Petka Antonov编写的。这是一个定制项目,目前还相当原始。我很想玩弄它,因为你的问题听起来很有趣。我举了一个例子(如下),它生成了具有不同解决时间的工作人员。结果表明,bluebird队列
行为不一致。除最后一组项目(如您所述)外的所有项目都在一组中排队,并且只有在上一组项目完成后,下一组项目才会开始。但是,最后一组项目并非如此。您可以使用N
和concurrency
来跟踪它
var Promise = require("bluebird");
var Queue = require('bluebird-queue');
function formatTime(date){
function pad(value, width){
width = width || 2;
if(typeof value !== 'string') value = value.toString();
if(value.length < width) value = new Array(width - value.length + 1).join('0') + value;
return value;
}
return pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds()) + ':' + pad(date.getMilliseconds(), 3);
}
var N = 20;
var start = function(){
var queue = new Queue({
concurrency: 4,
delay: 10, // ms
interval: 1 // ms not quite sure what this means
});
for(var i = 0; i < N; i++){
var worker = function(number) {
return new Promise(function (resolve, reject) {
console.log(formatTime(new Date()) + ' Starting ' + number);
setTimeout(function () {
console.log(formatTime(new Date()) + ' Finished ' + number);
resolve(number);
}, 500 + (number % 2)*500);
});
}.bind(null, i);
queue.add(worker);
}
queue.start().then(function(arg){
console.log('All finished ' + arg);
});
};
var Promise=require(“蓝鸟”);
var Queue=require('bluebird-Queue');
函数格式化时间(日期){
功能板(值、宽度){
宽度=宽度| | 2;
if(typeof value!=“string”)value=value.toString();
如果(value.length
谢谢,我的时间很紧,没有检查代码,想看看是否有人已经知道区别,但感谢大家的关注,Hanks@kirillslatin在