节点:async.parallelLimit 具有异步功能和等待

node: async.parallelLimit with async functions and await

我正在尝试“并行”执行一些(数千个)作业。 问题是每个作业都可能包含对外部服务器的请求,需要几 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 函数的末尾仍有作业 运行。

那么我如何正确执行我的异步 processJob 函数,它们将以有限的并发执行,并且当 doSomething 结束时所有作业都已处理(因此我可以继续下一批工作)。

我觉得Slebetman的回答可以解决你的问题

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

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();