什么是异步任务调度器
异步任务调度器是用于管理和调度异步任务的机制。可以帮助我们在合适的时间执行异步任务,并且可以控制它们的执行顺序
说人话来说就是,看电视,打王者,刷抖音三件事,去排个先后顺序,然后依次执行
众所周知,js是单线程的,简单粗暴理解就是,一次只能做一件事(比如一个人用一台手机,一次只能干一件事情,要么打王者,要么刷抖音,要么追剧),当然能分屏或者双开的我们暂不考虑,只说常规情况,只有做完一件事之后才能做下一件事
如何实现异步任务调度器
首先,需要知道异步任务调度器的关键点,需要任务按照顺序执行,需要存储待执行的任务
/**
* 手写异步任务调度器
*/
class Schedule {
constructor(){
// 定义一个存储任务的数组
this.taskList = []
// 定义一个flag,用于判断任务是否继续执行
this.running = false
}
// 添加任务
addTask (item) {
this.taskList.push(item)
}
// 执行任务
runTask () {
// 如果存储的任务执行完了,需要改变flag状态,结束执行
if (!this.taskList.length) {
this.running = false
return
}
// 否则就是还有任务需要执行
this.running = true
// 需要取出任务列表中的第一个任务,并且将其作为函数执行,
// 执行完成后继续调用runTask(),执行下一个任务
// ps: arr.shift()用于移出数组的第一个元素,并返回该元素
const task = this.taskList.shift()
task(() => {
this.runTask()
})
}
}
顺序执行任务我们通过数组的push方法和shift方法模拟,其实也是构造了一个简单的队列结构
是不是感觉很简单,别急,难度马上升级
实现并发数量限制的异步任务调度器,可以规定最大同时运行的任务
这道题难点在于,并发数量限制,同时运行的最多任务
/**
* 手写带有并发数量限制的异步任务调度器
*/
class Schedule {
constructor(limit = 1) {
// 存储任务的数组
this.taskList = [];
// 任务是否继续执行的标志
this.running = false;
// 并发数量限制
this.limit = limit;
// 当前正在执行的任务数量
this.currentCount = 0;
}
// 添加任务
addTask(item) {
this.taskList.push(item);
}
// 执行任务
runTask() {
// 如果存储的任务执行完了,需要改变flag状态,结束执行
if (!this.taskList.length) {
this.running = false;
return;
}
// 否则就是还有任务需要执行
this.running = true;
// 使用while循环控制并发数量
while (this.currentCount < this.limit && this.taskList.length > 0) {
const task = this.taskList.shift();
// 当前执行的任务数量+1
this.currentCount++;
task(() => {
// 执行完成后,任务数量-1
this.currentCount--;
this.runTask();
});
}
}
}
我们使用变量limit记录最大的并发数量,使用currentCount记录正在执行的任务数量
使用while循环控制并发数量,只有当满足当前执行任务数量小于最大并发数量时候才能继续执行