文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于JS实现带并发限制的异步调度器

2023-05-20 05:47

关注

题目描述

JS实现一个带并发限制的异步调度器scheduler,保证同时运行的任务最多有两个。

例如目前有4个任务,完成时间分别为,1000ms,500ms,300ms,400ms

那么在该调度器中的执行完成顺序应该为2、3、1、4.

因为1、2先进入队列中,2完成则输出2,3进入,3完成输出3,此时为800ms,4进入后的200ms,1完成输出1,而后4完成输出4.

实现最多两个任务同时运行。

代码调用模板大概是:

class Scheduler{
    add(promiseCreator){.....}
}
// 设置一个以每time秒执行异步任务的定时器
const timeout = (time) => {
  new Promise(resolve => {
    setTimeout(resolve,time)
  })
}
// 实例
const scheduler = new Scheduler()
const addTask = (time,order)=>{
    scheduler.add(()=>{ //调用实例的方法
        timeout(time) //每time秒执行一下任务(其实每一秒就行->time=1000ms即可)
    })
}

emmmmm我先来分析下....刚看这题有点懵,

通俗点:有个只能同时执行俩任务的队列,正在以每time秒执行这些任务,且任务按照顺序进入队列。

那,同时运行的任务不能超过两个,是不是每次运行一个任务时就放进数组中,判断任务的length是否小于2,在大于0且小于2的情况下就即刻执行该promise函数。

欸嘿,那运行两个任务的时候怎么办?要对promise函数进行一个选型,不能用一般的promise.then咯,在这同时运行的两个任务中需要有一个先后判断,哪个先执行完,需要下一个任务接替执行的,所以这当中存在一个“竞赛”关系,选择使用promise.race咯。(ps:这俩任务给我卷起来!!!!)

确认一下捏,有一个任务在队列中的情况时,只需要执行该任务,and执行完从队列中删除就好了。

but有两个的时候就要判断辽,只要队列中的size等于/大于2,就要进行promise.race的赛跑执行,finally执行完再去add下一个(promise任务)进来接着卷~。

就酱紫,写代码叭~

class Scheduler{
  queue = new Set<Promise<any>>() //去重的promise队列~
  add(promiseCreator:()=>Promose<any>){ //每次用来加任务的方法~~
      if(this.queue.size>0 && this.queue.size<2){
          const promise = promiseCreator()
          this.queue.add(promise)
          promise.finally(()=>{
              this.queue.delete(promise)
          })
          return promise
      }
      // 只要到了2个任务 就开始race这俩任务
      // race出个结果再继续放下一个(doge)卷起来
      const queueArr = []
      this.queue.forEach(item => queueArr.push(item)) // 放进数组中~
      return Promise.race(queueArr).finally(this.add(promiseCreator))
  }
}

get!,最后再调用下可以查看结果啦。

addTask(1000,1)
addTask(500,2)
addTask(300,3)
addTask(400,4)

快看看是不是2、3、1、4叭~

到此这篇关于基于JS实现带并发限制的异步调度器的文章就介绍到这了,更多相关JS异步调度器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯