class Scheduler {
constructor() {
this.tasks = [], // 待執行的任務
this.usingTask = [] // 正在執行的任務
}
// promiseCreator 是一個非同步函式,return Promise
add(promiseCreator) {
return new Promise((resolve, reject) => {
promiseCreator.resolve = resolve
if (this.usingTask.length < 2) {
this.usingRun(promiseCreator)
} else {
this.tasks.push(promiseCreator)
}
})
}
usingRun(promiseCreator) {
this.usingTask.push(promiseCreator)
promiseCreator().then(() => {
promiseCreator.resolve()
this.usingMove(promiseCreator)
if (this.tasks.length > 0) {
this.usingRun(this.tasks.shift())
}
})
}
usingMove(promiseCreator) {
let index = this.usingTask.findIndex(promiseCreator)
this.usingTask.splice(index, 1)
}
}
const timeout = (time) => new Promise(resolve => {
setTimeout(resolve, time)
})
const scheduler = new Scheduler()
const addTask = (time, order) => {
scheduler.add(() => timeout(time)).then(() => console.log(order))
}
addTask(400, 4)
addTask(200, 2)
addTask(300, 3)
addTask(100, 1)
// 2, 4, 3, 1
複製程式碼
javascript 實現一個帶併發限制的非同步排程器,保證同時最多執行2個任務
相關文章
- 實現一個併發任務執行框架框架
- laravel框架任務排程(定時執行任務)Laravel框架
- quartz在job間隔期間內,保證上一個任務執行完後,再去排程下一個任務(轉),在多執行緒情況下的問題quartz執行緒
- Android如何保證一個執行緒最多隻能有一個LooperAndroid執行緒OOP
- Java併發程式設計(二)如何保證執行緒同時/交替執行Java程式設計執行緒
- celery 與 flask 實現非同步任務排程Flask非同步
- 使用Java實現定時任務排程Java
- 基於Hyperf開發的任務排程系統.支援任務投遞,DAG任務編排(多個任務使用同一個事務).
- 如何在Java中實現非同步任務排程?Java非同步
- 封裝一個阻塞佇列,輕鬆實現排隊執行任務功能!封裝佇列
- crontab+shell 實現每秒執行一個任務
- Aloha:一個分散式任務排程框架分散式框架
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- 一個簡單的基於 Redis 的分散式任務排程器 —— Java 語言實現Redis分散式Java
- Appium 最多能夠同時併發多少個手機APP
- AsyncTask實現非同步任務執行非同步
- OpenMP 中的執行緒任務排程執行緒
- 【c#】分享一個簡易的基於時間輪排程的延遲任務實現C#
- 深入 Java Timer 定時任務排程器實現原理Java
- 在Spring中使用JDK定時器實現排程任務SpringJDK定時器
- 怎樣實現一個非阻塞的超時重試任務佇列佇列
- 實現一個任務排程系統,看這篇文章就夠了
- linux實現一個定時任務Linux
- Java併發實戰(六) 任務執行Java
- PHP定時執行任務的實現PHP
- Flink - Task 任務排程執行流程
- goroutine併發執行多個任務並依次返回結果Go
- 今天,總監說要一個任務排程的列表。
- 一個輕量級的分散式定時任務排程平臺-Cloudtask分散式Cloud
- CloseableHttpClient 連線超時導致XxlJob排程阻塞,影響排程任務的執行HTTPclient
- 什麼?一個核同時執行兩個執行緒?執行緒
- 一臺機器同時執行兩個或多個tomcatTomcat
- Linux 中 Laravel 任務排程不執行LinuxLaravel
- goroutine併發執行多個任務並依次返回結果2——sync.WaitGroupGoAI
- 23行程式碼實現一個帶併發數限制的fetch請求函式行程函式
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 基於Azkaban的任務定時排程實踐
- 任務排程並行演算法的Java簡單實現並行演算法Java