并发任务控制
作者:xie392地址:https://v.douyin.com/iemvkACm/更新时间:2024-12-21
案例代码
1function timeout(time) {2return new Promise(resolve => {3setTimeout(() => {4resolve()5}, time)6})7}89class SuperTask {10constructor(parallelCount = 2) {11// 并发数量12this.parallelCount = parallelCount13// 任务列表14this.task = []15// 正在执行的任务16this.runningCount = 017}1819add(task) {20return new Promise((resolve, reject) => {21this.task.push({22task,23resolve,24reject25})26this._run()27})28}2930_run() {31// 如果还有任务32if (this.runningCount < this.parallelCount && this.task.length > 0) {33// 从任务列表中取出一个任务,取出后去除该任务34const { task, resolve, reject } = this.task.shift()35// 正在执行任务总数 + 136this.runningCount++37// 执行任务38task().then(resolve, reject).finally(() => {39// 执行完毕,正在执行任务总数 - 140this.runningCount--41// 开始下一个任务42this._run()43})44}45}46}474849const superTask = new SuperTask()5051function addTask(time, name) {52superTask53.add(()=>timeout(time))54.then(() => {55console.log(`任务 ${name} 完成`)56})57}585960addTask(10000, '任务1') // 361addTask(5000, '任务2') // 162addTask(3000, '任务3') // 263addTask(2000, '任务4') // 464addTask(1000, '任务5') // 5
输出结果:
1任务 任务2 完成2任务 任务3 完成3任务 任务1 完成4任务 任务4 完成5任务 任务5 完成
目录