并发任务控制

作者:xie392地址:https://v.douyin.com/iemvkACm/更新时间:2024-12-21

案例代码

1
function timeout(time) {
2
return new Promise(resolve => {
3
setTimeout(() => {
4
resolve()
5
}, time)
6
})
7
}
8
9
class SuperTask {
10
constructor(parallelCount = 2) {
11
// 并发数量
12
this.parallelCount = parallelCount
13
// 任务列表
14
this.task = []
15
// 正在执行的任务
16
this.runningCount = 0
17
}
18
19
add(task) {
20
return new Promise((resolve, reject) => {
21
this.task.push({
22
task,
23
resolve,
24
reject
25
})
26
this._run()
27
})
28
}
29
30
_run() {
31
// 如果还有任务
32
if (this.runningCount < this.parallelCount && this.task.length > 0) {
33
// 从任务列表中取出一个任务,取出后去除该任务
34
const { task, resolve, reject } = this.task.shift()
35
// 正在执行任务总数 + 1
36
this.runningCount++
37
// 执行任务
38
task().then(resolve, reject).finally(() => {
39
// 执行完毕,正在执行任务总数 - 1
40
this.runningCount--
41
// 开始下一个任务
42
this._run()
43
})
44
}
45
}
46
}
47
48
49
const superTask = new SuperTask()
50
51
function addTask(time, name) {
52
superTask
53
.add(()=>timeout(time))
54
.then(() => {
55
console.log(`任务 ${name} 完成`)
56
})
57
}
58
59
60
addTask(10000, '任务1') // 3
61
addTask(5000, '任务2') // 1
62
addTask(3000, '任务3') // 2
63
addTask(2000, '任务4') // 4
64
addTask(1000, '任务5') // 5

输出结果:

1
任务 任务2 完成
2
任务 任务3 完成
3
任务 任务1 完成
4
任务 任务4 完成
5
任务 任务5 完成