并发任务控制

49 阅读1分钟

并发任务控制

想想在银行取小票排队叫号的场景,最多执行N个任务

function timeout(time){
    return new Promise((reslove,reject)=>{
        setTimeout(() => {
            reslove(time)
        }, time);
    })
}

class SuperTask{
    constructor(parallelCount=2){
        this.parallelCount = parallelCount
        this.tasks = []
        this.runningCount = 0
    }

    add(task){
        return new Promise((reslove,reject)=>{
            this.tasks.push({task,reslove,reject})
            this._run()
        })
    }

    _run(){
        while(this.runningCount < this.parallelCount && this.tasks.length){
            this.runningCount++
            const {task,reslove,reject} = this.tasks.shift()
            task().then(reslove,reject).finally(()=>{
                this.runningCount--
                this._run()
            })
        }
    }
}

const superTask = new SuperTask()

function addTask(time,name){
    superTask
    .add(()=>timeout(time))
    .then(()=>{
        console.log(`任务${name}完成`);
    })
}

addTask(10000,1)
addTask(5000,2) 
addTask(3000,3)
addTask(4000,4)
addTask(5000,5)
addTask(1000,6)