基本信息
文件名称:基于JS实现带并发限制的异步调度器.docx
文件大小:16.44 KB
总页数:3 页
更新时间:2025-05-20
总字数:约1.68千字
文档摘要

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

题目描述

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.

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

代码调用模板大概是:

classScheduler{

add(promiseCreator){.....}

//设置一个以每time秒执行异步任务的定时器

consttimeout=(time)={

newPromise(resolve={

setTimeout(resolve,time)

//实例

constscheduler=newScheduler()

constaddTask=(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任务)进来接着卷~。

就酱紫,写代码叭~

classScheduler{

queue=newSetPromiseany()//去重的promise队列~

add(promiseCreator:()=Promoseany){//每次用来加任务的方法~~

if(this.queue.size0this.queue.size2){

constpromise=promiseCreator()

this.queue.add(promise)

promise.finally(()={

this.queue.delete(promise)

returnpromise

//只要到了2个任务就开始race这俩任务

//race出个结果再继续放下一个(doge)卷起来

constqueueArr=[]

this.queue.forEach(item=queueArr.push(item))//放进数组中~

returnPromise.race(queueArr).finally(this.add(promiseCreator))

}

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

addTask(1000,1)

addTask(500,2)

addTask(300,3)

addTask(400,4)

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