并发控制调度器简易实现

并发控制调度器简易实现

场景

写一个调度器,控制页面中最大并发的异步任务数不超过 MAX_COUNT

思路

递归调用执行器,记录当前运行的异步任务数。当满足以下两个条件之一,添加异步任务:

  1. 当前正在执行的异步任务数量小于 MAX_COUNT
  2. 有异步任务已完成,且存在未完成异步任务

代码


class Schedule {
    MAX_COUNT = 2;
    taskList = [];
    currentCount = 0;

    addTask(task) {
        return new Promise((resolve) => {
            this.taskList.push({
                task,
                resolve
            });
            this.schedule();
        });
    }

    schedule() {
        if (this.taskList.length && this.currentCount < this.MAX_COUNT) {
            const { task, resolve } = this.taskList.shift();
            this.currentCount++;
            task().then(() => {
                this.currentCount--;
                resolve();
                this.schedule();
            })
        } 
    }
}

测试

const timeout = (delay) => {
    return new Promise((resolve) => {
        setTimeout(resolve, delay)
    });
}

const schedule = new Schedule();
const addTask = (delay, order) => {
    schedule.addTask(() => timeout(delay)).then(() => console.log(order));
}

addTask(1000, '1');
addTask(400, '2');
addTask(300, '3');
addTask(500, '4');

// output
// 2 3 1 4