Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺队列中的Bluebird队列并发性未按预期工作_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 承诺队列中的Bluebird队列并发性未按预期工作

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队列,然

我正在使用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队列,然后调用
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在