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 @   樊顺  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示