Async.queue和Promise.map有什么区别?

时间:2019-01-05 03:16:46

标签: express

我试图在ExpressJS中对我的api进行压力测试,并处理多个请求,我先使用Promise.all,然后使用带有并发选项的Async.queue。

  1. 承诺:

    export const myapi = async (args1, args2) => {
    console.log('args:', args1, args2);
    
    let testing_queue = [];
    testing_queue.push(new Promise(async (resolve, reject) => {
            let result = await doAComplexQuery(args1, args2); // SELECT... JOIN...
            if (!result || result.length <= 0)
                reject(new Error('Cannot find anything!'));
            resolve(result);
        }
    ));
    return await Bluebird.map(testing_queue, async item => {
        return item;
    }, {concurrency: 4});    };
    
  2. 异步队列:(https://www.npmjs.com/package/async

    export const myapi = async (args1, args2) => {
    console.log('args:', args1, args2);
    
    let testing_queue = Async.queue(function (task, callback) {
        console.log('task', task);
        callback();
    }, 4);
    testing_queue.push(async function () {
            let result = await doAComplexQuery(args1, args2); // SELECT... JOIN...
            if (!result || result.length <= 0)
                throw new Error('Cannot find anything!');
            return result;
        }
    );};
    

并尝试尽可能多地提出请求:

const response = async function () {
    return await Axios.post('http://localhost:3000/my-api', {
        "args1": "0a0759eb",
        "args2": "b9142db8"
    }, {}
    ).then(result => {
        return result.data;
    }).catch(error => {
        console.log(error.message);
    });
};

for (var i = 0; i < 10000; i++) {
    response();
}

然后运行。 #1方法返回许多ResourceTimeout或Socket挂断响应。同时,#2返回所有请求的成功响应,并且运行速度甚至更快。

那么在这种情况下Async.queue更好吗?

1 个答案:

答案 0 :(得分:0)

如果您提高promise.map的并发限制,我认为这可以提高速度。