zoukankan      html  css  js  c++  java
  • 异步调度器Scheduler

    /**
     * 题目: JS实现一个带并发限制的异步调度器Scheduler,保证同时运行的任务最多有两个。完善代码中Scheduler类,使得以下程序能正确输出
     * 条件: 只能修改Sheduler
     **/
    class Scheduler {
      constructor(){
        this.cache = [] // 缓存任务数据
        this.task = [] // 当前执行任务队列
        this._max =  2 // 最大并发任务
      }
      add(promiseCreator) { 
          return new Promise(resolve=>{
            promiseCreator.resolve = resolve; // 保存当前promise的状态
            if(this.task.length < this._max) { // 最大并发任务处理
              this.runWork(promiseCreator)
            } else {
              this.cache.push(promiseCreator)
            }
          })
       }
       runWork(promiseCreator) {
        this.task.push(promiseCreator)
        promiseCreator().then(() => {
          promiseCreator.resolve()
          this.task.splice(this.task.indexOf(promiseCreator), 1) // 当前任务执行完成 清除task中的数据
          if(this.cache.length) {
               this.runWork(this.cache.shift()) // 根据执行的缓存顺序执行,保证执行的有序性
          }
        })
       }
    }
    const timeout = (time) => new Promise(resolve => {
      setTimeout(resolve, time)
    })
    const scheduler = new Scheduler()
    const addTask = (time, order) => {
      const result = scheduler.add(() => timeout(time))
      result.then(() => console.log(order + 'order'))
    }
    
    addTask(1000, '1')
    addTask(500, '2')
    addTask(300, '3')
    addTask(400, '4')// output: 2 3 1 4
    // 一开始,1、2两个任务进入队列
    // 500ms时,2完成,输出2,任务3进队
    // 800ms时,3完成,输出3,任务4进队
    // 1000ms时,1完成,输出1
    // 1200ms时,4完成,输出4
    

      

  • 相关阅读:
    生成器
    字典生成式
    列表推导式
    函数基础实战之ATM和购物车系统
    函数基础小结
    函数嵌套
    可变长参数
    函数参数
    java NIO(三)----通道(Channel)
    java NIO(二)----直接缓冲区和非直接缓冲区
  • 原文地址:https://www.cnblogs.com/ygunoil/p/15165441.html
Copyright © 2011-2022 走看看