【问题标题】:node: async.parallelLimit with async functions and await节点:带有异步函数和等待的 async.parallelLimit
【发布时间】:2022-01-27 01:06:27
【问题描述】:

我正在尝试“并行”执行一些(数千个)作业。 问题是每个作业都可能包含对外部服务器的请求,需要几 MB 内存。因此,仅异步执行它们是一个坏主意,因为这会导致外部服务器过载并且 RAM 使用量会爆炸。

所以我试图以有限的并发性执行这些作业。基于我的研究和我对找到的其他解决方案的理解能力,我决定使用async.parallelLimit() 并尝试以这种方式使用它:

async function doSomething(jobDataList) {
    let tasks = jobDataList.map(function(jobInfo) {
        return async function() {
            await processJob(jobInfo);
        }
    });

    await async.parallelLimit(tasks, 4);
    // all jobs have to be finished here.
}

上述代码无法正常运行,尤其是在doSomething 函数结束时仍有作业在运行。

那么我如何正确地执行我的 async processJob 函数,使其以有限的并发执行,并且当 doSomething 结束时所有作业都已处理(这样我就可以继续处理下一批作业)。

【问题讨论】:

    标签: node.js asynchronous async.js


    【解决方案1】:

    我认为 Slebetman 的回答可以解决你的问题 answer of Slebetman

    您可以使用 asyncq lib 来运行并行限制

    const asyncq = require('async-q');
    
    function timeout(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    
    async function processJob(name, loop) {
        await timeout(500);
        console.log(Date.now() + " " + name + " " + loop);
    }
    
    async function masterFunction(name) {
        let list = Array.from(Array(10).keys());
    
        let tasks = list.map(function(i) {
            return async function() {
                return processJob(name, i);
            }
        });
    
        let result = await asyncq.parallelLimit(tasks, 2);
        console.log('all jobs have to be finished here.');
    }
    
    (async() => {
        await masterFunction("a");
        await masterFunction("b");
    }).call();
    

    【讨论】:

    • 你的任务是函数。这些函数返回承诺。在 Slebetman 的回答中,任务也是返回承诺的函数。我认为它们是相同的,它们是返回承诺的函数,是异步的
    • 我只是在我的答案中添加示例。这个例子对吗?
    • 谢谢,我改进了您的示例,使其更好地匹配我的问题中的代码。
    • 不客气,太好了
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    相关资源
    最近更新 更多