js 实现多并发任务处理
class SuperTask {constructor(number) {// 最大并发数量this.max = number;// 总任务队列this.list = [];// 正在执行的任务数量this.runningCount = 0;}add(fn) {return new Promise((resolve) => {this.list.push({ fn, resolve });this.run();});}run() {// 用if如果任务都能成功添加也可以达到相同的效果,但是如果任务添加失败,就会导致该位置一直空缺// 用if假设任务加完后,再扩充或缩小并发数量也是达不到效果的while(this.runningCount < this.max && this.list.length > 0) {const { fn, resolve } = this.list.shift();this.runningCount++;fn().then(() => {resolve();this.runningCount--;// 一个任务执行完接着执行this.run();});}}
}const timeout = async (time) => {return new Promise((resolve) => {setTimeout(() => {resolve();}, time);})
};const supertask = new SuperTask(2);
const addTask = (time, name) => {const label = `任务${name}`;console.time(label);supertask.add(() => timeout(time)).then(() => {console.timeEnd(label);});
};addTask(10000, 1); // 10s 后输出: 任务1完成;
addTask(5000, 2); // 5s 后输出: 任务2完成
addTask(3000, 3); // 8s 后输出: 任务3完成
addTask(4000, 4); // 12s 后输出:任务4完成
addTask(5000, 5); // 15s 后输出:任务5完成
输出结果: