基于JS實現(xiàn)帶并發(fā)限制的異步調(diào)度器
題目描述
JS實現(xiàn)一個帶并發(fā)限制的異步調(diào)度器scheduler,保證同時運行的任務(wù)最多有兩個。
例如目前有4個任務(wù),完成時間分別為,1000ms,500ms,300ms,400ms
那么在該調(diào)度器中的執(zhí)行完成順序應(yīng)該為2、3、1、4.
因為1、2先進入隊列中,2完成則輸出2,3進入,3完成輸出3,此時為800ms,4進入后的200ms,1完成輸出1,而后4完成輸出4.
實現(xiàn)最多兩個任務(wù)同時運行。
代碼調(diào)用模板大概是:
class Scheduler{ add(promiseCreator){.....} } // 設(shè)置一個以每time秒執(zhí)行異步任務(wù)的定時器 const timeout = (time) => { new Promise(resolve => { setTimeout(resolve,time) }) } // 實例 const scheduler = new Scheduler() const addTask = (time,order)=>{ scheduler.add(()=>{ //調(diào)用實例的方法 timeout(time) //每time秒執(zhí)行一下任務(wù)(其實每一秒就行->time=1000ms即可) }) }
emmmmm我先來分析下....剛看這題有點懵,
通俗點:有個只能同時執(zhí)行倆任務(wù)的隊列,正在以每time秒執(zhí)行這些任務(wù),且任務(wù)按照順序進入隊列。
那,同時運行的任務(wù)不能超過兩個,是不是每次運行一個任務(wù)時就放進數(shù)組中,判斷任務(wù)的length是否小于2,在大于0且小于2的情況下就即刻執(zhí)行該promise函數(shù)。
欸嘿,那運行兩個任務(wù)的時候怎么辦?要對promise函數(shù)進行一個選型,不能用一般的promise.then咯,在這同時運行的兩個任務(wù)中需要有一個先后判斷,哪個先執(zhí)行完,需要下一個任務(wù)接替執(zhí)行的,所以這當(dāng)中存在一個“競賽”關(guān)系,選擇使用promise.race咯。(ps:這倆任務(wù)給我卷起來!?。。。?/p>
確認(rèn)一下捏,有一個任務(wù)在隊列中的情況時,只需要執(zhí)行該任務(wù),and執(zhí)行完從隊列中刪除就好了。
but有兩個的時候就要判斷遼,只要隊列中的size等于/大于2,就要進行promise.race的賽跑執(zhí)行,finally執(zhí)行完再去add下一個(promise任務(wù))進來接著卷~。
就醬紫,寫代碼叭~
class Scheduler{ queue = new Set<Promise<any>>() //去重的promise隊列~ add(promiseCreator:()=>Promose<any>){ //每次用來加任務(wù)的方法~~ 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個任務(wù) 就開始race這倆任務(wù) // race出個結(jié)果再繼續(xù)放下一個(doge)卷起來 const queueArr = [] this.queue.forEach(item => queueArr.push(item)) // 放進數(shù)組中~ return Promise.race(queueArr).finally(this.add(promiseCreator)) } }
get!,最后再調(diào)用下可以查看結(jié)果啦。
addTask(1000,1)
addTask(500,2)
addTask(300,3)
addTask(400,4)
快看看是不是2、3、1、4叭~
到此這篇關(guān)于基于JS實現(xiàn)帶并發(fā)限制的異步調(diào)度器的文章就介紹到這了,更多相關(guān)JS異步調(diào)度器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript安全加密之禁止別人調(diào)試自己的前端頁面代碼實現(xiàn)
這篇文章主要為大家介紹了JavaScript安全加密之如何禁止別人調(diào)試自己的前端頁面代碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08AngularJs中Bootstrap3 datetimepicker使用實例
這篇文章主要為大家詳細(xì)介紹了AngularJs中Bootstrap3 datetimepicker使用實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12自用js開發(fā)框架小成 學(xué)習(xí)js的朋友可以看看
前段時間項目需要用到j(luò)s樹,找了好多都不符合項目需求,后來發(fā)現(xiàn)了梅花雪樹和js框架,類似C#名稱空間的用法讓我眼前一亮,遂拿來主義,讀了幾遍代碼后就開工了(我是個急性子呵呵),完成了大部分,最近才找出來測試了下。2010-11-11