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