JS手写练习随笔-20221226.2 ---- 带并发限制的异步调度器

最多保持特定数量任务执行的异步调度器

class Scheduler {
  // 最大任务执行数目
  private maxCnt: number;
  // 正在执行的任务数目
  private runningCnt: number;
  // 任务队列
  private taskQueue: Array<() => Promise<void>>;

  /**
   * 构造器
   * @param maxCnt - 最大可执行数目
   */
  constructor(maxCnt: number) {
    this.maxCnt = maxCnt;
    this.runningCnt = 0;
    this.taskQueue = [];
  }

  /**
   * 添加任务
   * @param interval - 执行间隔
   * @param order - 任务序号
   */
  add(interval: number, order: string) {
    const creator = () => {
      return new Promise<void>(resolve => {
        setTimeout(() => {
          console.info("order: ", order);
          resolve();
        }, interval);
      });
    };
    this.taskQueue.push(creator);
  }

  /**
   * 调用任务
   */
  private call() {
    if (!Array.isArray(this.taskQueue) || this.taskQueue.length === 0 || this.runningCnt >= this.maxCnt) {
      return;
    }
    const taskFn = this.taskQueue.shift();
    if (typeof taskFn !== 'function') {
      return;
    }
    this.runningCnt++;
    taskFn()
      .then(() => {
        this.runningCnt--;
        this.call();
      });
  }

  /**
   * 启动器
   */
  start() {
    for (let i = 0; i < this.maxCnt; i++) {
      this.call();
    }
  }
}

const scheduler = new Scheduler(2);
scheduler.add(1000, "1");
scheduler.add(500, "2");
scheduler.add(200, "3");
scheduler.add(400, "4");
scheduler.start();

 

posted @ 2022-12-26 23:10  樊顺  阅读(54)  评论(0编辑  收藏  举报