node.js 中的并发控制机制

Concurenncy control mechanism in node.js

提问人:davaer 提问时间:11/16/2023 更新时间:11/17/2023 访问量:27

问:

const tasks = ...
let concurenncy = 2;
let running = 0;
let completed = 0;
let index = 0;
function next() {
    while (running < concurenncy && index < tasks.length) {
        const task = tasks[index++];
        task(() => {
            if (completed === tasks.length) {
                return finish();
            }
            completed++;
            running--;
            next();
        });
        running++;
    }
}
next();

function finish() {
    console.log('All tasks are done');
}

您好,我有一个关于上面代码的问题。任务是我需要执行的异步任务数组,concurenncy 是可以并发运行的最大任务数。程序从前两个任务从数组中提取并执行的地方开始。一个任务结束后,将调用该特定任务的回调函数。为什么我需要在该回调中再次调用 next() 方法?如果回调完成,当前下一个方法中的循环会不会再次检查是否应该处理下一个任务?提前致谢

提前致谢!!

节点.js

评论


答:

0赞 jfriend00 11/17/2023 #1

为什么我需要在该回调中再次调用 next() 方法?

该循环只调用前 N 个任务,其中 N 是 is 的值,然后该循环完成,循环退出,因为在您启动了多个任务后将不再为 true。whileconcurrencyrunning < concurenncyconcurenncy

然后,在一段时间后,其中一个任务将完成并调用其回调,并且您传递给每个任务的回调将执行。如果要然后启动另一个任务,则必须在该回调中再次调用,因为循环已经退出。next()while


仅供参考,您的检查似乎有问题,因为您在计算刚刚完成的任务之前正在进行比较。你不应该在比较之前做吗?completed === tasks.lengthcompleted++completed === tasks.length