/**
* 多条任务并行处理
* 通过start和parse方法操作
* 每个任务拥有原子性,一个任务开始执行后不可中断
*
* 场景举例:窗口排队办业务,多个窗口顺序办理业务。
*
*/
class TaskController {
constructor(tasks, thread = 2) {
this.tasks = tasks;
this.threadList = new Array(thread);
this.isRunning = false;
this.runIndex = -1;
}
start() {
if (this.isRunning) {
//防止重复点击
return;
}
this.isRunning = true;
for (const index of this.threadList) {
this.run();
}
}
run() {
//暂停或者执行完毕,退出执行
if (!this.isRunning || this.runIndex + 1 >= this.tasks.length) {
this.isRunning = false;
return;
}
//如果有空闲的进程,加入任务
for (let i = 0; i < this.threadList.length; i++) {
if (!this.threadList[i]) {
this.runIndex++;
this.threadList[i] = this.tasks[this.runIndex];
console.log('线程' + i, '开始任务' + this.runIndex);
let threadIndex = i;
let runIndex = this.runIndex;
this.threadList[threadIndex]().finally(() => {
this.threadList[threadIndex] = undefined;
console.log('线程' + threadIndex, '结束任务' + runIndex);
this.run();
})
break;
}
}
}
parse() {
this.isRunning = false;
}
}
function getPromise(time, num) {
return function () {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('执行任务', num)
resolve();
}, time);
})
}
}
let tasks = [
getPromise(1000, 0),
getPromise(4000, 1),
getPromise(2000, 2),
getPromise(2000, 3),
getPromise(2000, 4),
];
/*
输出结果
0:0,2,3
1:1,4
*/
let taskCtr = new TaskController(tasks, 2);
taskCtr.start();
js异步并发任务执行控制
于 2023-10-20 23:12:39 首次发布