首页 > 其他分享 >JS手写练习随笔-20221226.2 ---- 带并发限制的异步调度器

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

时间:2022-12-26 23:23:49浏览次数:45  
标签:runningCnt number 20221226.2 JS ---- taskQueue add scheduler maxCnt

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

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();

 

标签:runningCnt,number,20221226.2,JS,----,taskQueue,add,scheduler,maxCnt
From: https://www.cnblogs.com/fanqshun/p/17007116.html

相关文章

  • 在WPF/C#中使用分布类对VM进行拆分
    摘要C#的分部关键字(partial)能够拆分一个类、一个结构、一个接口或一个方法为两个或更多个的文件,分部的每个文件都可以包含自己的类型和方法,程序编译时会将同类的分部内容......
  • 关于c++中读入输出方式的重定向
    今天氵数据结构实验的时候发现了关于cpp文件和控制台输入输出重定向的问题。题目要求先从文件读入,然后再从控制台读入,再从控制台输出,最后输出到文件。本来想的是用freope......
  • 使用ssh远程连接云服务器
    使用ssh命令远程连接linux服务器有两种方式,一种是账号密码,一种是秘钥。第一种:账号密码#远程连接命令,-p端口号账号@服务器公网[email protected]#按提示输入......
  • ffmpeg裁剪视频和openpose生成骨架
    剪视频,剪掉25秒之前的视频ffmpeg-iEverybody.mp4-ss00:00:25-s512x288-c:acopyoutput.mp4每帧25个图片输出ffmpeg-ioutput.mp4-r25%5d.png转换avi......
  • Vue之插槽
    插槽作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件===>子组件 。分类:默认插槽、具名插槽、作用域插槽使用方式: ......
  • 配置httpd虚拟主机
    配置httpd虚拟主机相同ip不同端口设置主机名[root@liu~]#vim/usr/local/apache/conf/httpd.conf...#Ifyourhostdoesn'thavearegisteredDNSname,enteri......
  • macOS下vscode配置c++万能头文件
    vscode正常情况下是不能使用c++的万能头文件#include<bits/stdc++.h>,那么这会给我们算法刷题带来一定的不便,以下是配置教程,具体可以参考该博文:macOS下使用bits/stdc++.h万......
  • 关于二叉树深度 和 高度的问题
    根节点的高度=最大深度(后序遍历)104.二叉树的最大深度publicintmaxDepth(TreeNoderoot){returngetDepth(root);}publicintgetDepth(TreeNo......
  • UG NX的prt文件缩略图无法显示
    在装了NX之后再装其他软件或其他版本时,可能会出现prt文件略缩图无法正常显示、双击文件无法正确打开软件,或软件打开后无法跳转到文件。出现上述问题后,可按下面几个方面检......
  • 牛客网刷题笔记篇
    字符串篇字符串翻转链接地址importjava.util.*;publicclassSolution{publicStringtrans(Strings,intn){//writecodehereif(n=......