并发控制调度器简易实现
场景
写一个调度器,控制页面中最大并发的异步任务数不超过 MAX_COUNT
思路
递归调用执行器,记录当前运行的异步任务数。当满足以下两个条件之一,添加异步任务:
- 当前正在执行的异步任务数量小于 MAX_COUNT
- 有异步任务已完成,且存在未完成异步任务
代码
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