node.js中的并发控制机制

lymnna71  于 2023-11-17  发布在  Node.js
关注(0)|答案(2)|浏览(99)
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');
}

字符串
你好,我有一个关于上面代码的问题。任务是我需要执行的异步任务的数组,concurrency是可以并发运行的任务的最大数量。程序开始时,前两个任务从数组中拉出来并执行。在一个任务结束后,该特定任务的回调函数被调用。为什么我需要在回调中再次调用next()方法?如果回调完成,当前next方法中的循环是否会再次检查下一个任务是否应该进行处理?
提前感谢!

bf1o4zei

bf1o4zei1#

为什么我需要在回调中再次调用next()方法?
while循环只调用前N个任务,其中N是concurrency的值,然后循环完成,循环退出,因为在您启动concurenncy任务数量后,running < concurenncy将不再为真。
然后,某个时候,其中一个任务将完成并调用其回调,并且您传递给每个任务的回调将执行。如果您想启动另一个任务,则必须在该回调中再次调用next(),因为while循环已经退出。
仅供参考,看起来你对completed === tasks.length的检查有问题,因为你在计算刚刚完成的任务之前进行了比较。在比较completed === tasks.length之前,你不应该做completed++吗?

mhd8tkvw

mhd8tkvw2#

感谢你给出了清晰的答案。所以,这里的while循环只用于开始前N个任务,而每个后续的next()函数调用实际上只启动一个任务,while循环的行为就像if语句,因为每个新任务都会启动自己的下一个函数?
你是绝对正确的关于完成++之前比较.再次感谢你!

相关问题