笔者字节一面的时候遇到了下面这个面试题:
//支持并发的调度器, 最多允许2两任务进行处理
const scheduler = new Scheduler(2)
scheduler.addTask(1, '1’); // 1s后输出’1'
scheduler.addTask(2, '2’); // 2s后输出’2'
scheduler.addTask(1, '3’); // 2s后输出’3'
scheduler.addTask(1, '4’); // 3s后输出’4'
scheduler.start();
当时由于紧张和经验不够,一下子卡壳了,没能及时做出来(痛哭)
回来后好好想了一下,有了以下的思路:
- 首先用一个maxCount记录允许并发的数量,用一个tasks数组保存所有开始之前设定的任务
- 我们需要对加入的任务进行一些封装,改成promise,这样就可以获取到完成的状态进行操作
- 我们用working数组保存正在运行的任务,用tasks保存还未完成的任务
- 在任务完成后,将tasks队列的第一个任务放入working中,并且运行
- 如此,通过递归,就可以完成一个并发控制器
// 异步调度器
class Scheduler {
maxCount = 0
tasks = []
working = []