简单聊聊异步任务调度器

什么是异步任务调度器

异步任务调度器是用于管理和调度异步任务的机制。可以帮助我们在合适的时间执行异步任务,并且可以控制它们的执行顺序

说人话来说就是,看电视,打王者,刷抖音三件事,去排个先后顺序,然后依次执行

 众所周知,js是单线程的,简单粗暴理解就是,一次只能做一件事(比如一个人用一台手机,一次只能干一件事情,要么打王者,要么刷抖音,要么追剧),当然能分屏或者双开的我们暂不考虑,只说常规情况,只有做完一件事之后才能做下一件事

如何实现异步任务调度器

首先,需要知道异步任务调度器的关键点,需要任务按照顺序执行,需要存储待执行的任务

/**
 * 手写异步任务调度器
 */
class Schedule {
    constructor(){
        // 定义一个存储任务的数组
        this.taskList = []
        // 定义一个flag,用于判断任务是否继续执行
        this.running = false
    }
    // 添加任务
    addTask (item) {
        this.taskList.push(item)
    }
    // 执行任务
    runTask () {
        // 如果存储的任务执行完了,需要改变flag状态,结束执行
        if (!this.taskList.length) {
            this.running = false
            return
        }
        // 否则就是还有任务需要执行
        this.running = true
        // 需要取出任务列表中的第一个任务,并且将其作为函数执行,
        // 执行完成后继续调用runTask(),执行下一个任务
        // ps: arr.shift()用于移出数组的第一个元素,并返回该元素
        const task = this.taskList.shift()
        task(() => {
            this.runTask()
        })
    }
}

顺序执行任务我们通过数组的push方法和shift方法模拟,其实也是构造了一个简单的队列结构

是不是感觉很简单,别急,难度马上升级

实现并发数量限制的异步任务调度器,可以规定最大同时运行的任务

这道题难点在于,并发数量限制,同时运行的最多任务

/**
 * 手写带有并发数量限制的异步任务调度器
 */
class Schedule {
    constructor(limit = 1) {
      // 存储任务的数组
      this.taskList = []; 
      // 任务是否继续执行的标志
      this.running = false; 
      // 并发数量限制
      this.limit = limit; 
      // 当前正在执行的任务数量
      this.currentCount = 0; 
    }
    // 添加任务
    addTask(item) {
      this.taskList.push(item);
    }
    // 执行任务
    runTask() {
      // 如果存储的任务执行完了,需要改变flag状态,结束执行
      if (!this.taskList.length) {
        this.running = false;
        return;
      }
      // 否则就是还有任务需要执行
      this.running = true;
      //  使用while循环控制并发数量  
      while (this.currentCount < this.limit && this.taskList.length > 0) {
        const task = this.taskList.shift();
        // 当前执行的任务数量+1
        this.currentCount++;
        task(() => {
          // 执行完成后,任务数量-1   
          this.currentCount--;
          this.runTask();
        });
      }
    }
  }

我们使用变量limit记录最大的并发数量,使用currentCount记录正在执行的任务数量

使用while循环控制并发数量,只有当满足当前执行任务数量小于最大并发数量时候才能继续执行

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值