MENU

JavaScript 前端实现调度器

• March 27, 2023 • Read: 1796 • Life

调度器释义

调度器是一种可以控制任务执行顺序的工具,通常用于异步任务的处理。在 JavaScript 中,我们可以使用 Promise 对象和 async/await 函数来实现调度器。

实现原理

在调度器中,我们需要维护一个任务队列,当任务完成后,调度器从队列中取出下一个任务并执行。如果同时允许多个任务并行执行,我们可以使用一个计数器来控制并发数。

代码实现

以下是一个使用 JavaScript 实现调度器的示例代码:

class Scheduler {
  constructor(concurrency) {
    this.concurrency = concurrency;
    this.running = 0;
    this.queue = [];
  }

  add(task) {
    this.queue.push(task);
    this.schedule();
  }

  schedule() {
    while (this.running < this.concurrency && this.queue.length) {
      const task = this.queue.shift();
      task().then(() => {
        this.running--;
        this.schedule();
      });
      this.running++;
    }
  }
}

该调度器使用了 Promise 来实现异步任务,并且可以设置并发数量,通过 add 方法添加任务到队列中,然后使用 schedule 方法执行队列中的任务。

当任务执行完成后,会调用 this.schedule() 方法继续执行队列中的任务,直到队列为空或者达到了并发限制。

使用该调度器可以实现在 JS 中对多个异步任务进行调度,控制其执行的先后顺序和并发数量。以下是使用该调度器的步骤:

要使用该调度器,首先需要创建一个实例并指定并发数量,例如:

// 定义任务列表
const scheduler = new Scheduler(2); // 指定并发数量为 2

然后可以使用 add 方法添加任务到队列中:

scheduler.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("Task 1 done");
      resolve();
    }, 1000);
  });
});

scheduler.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("Task 2 done");
      resolve();
    }, 2000);
  });
});

scheduler.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log("Task 3 done");
      resolve();
    }, 3000);
  });
});

上面的代码添加了三个异步任务到队列中,分别需要 1 秒、2 秒、3 秒才能执行完毕。由于并发数量为 2,所以只有前两个任务会同时执行,第三个任务会等待其中一个任务执行完毕后才会执行。

执行上述代码后,控制台会依次输出以下内容:

Task 1 done
Task 2 done
Task 3 done

即三个任务依次完成。

可以根据具体需要,自行修改调度器的并发数量来达到更好的性能或资源利用率。

第三个任务是几秒后打印?

由于第三个任务需要等待前面两个任务中的任意一个执行完毕后才能开始执行,而第一个任务执行需要的时间只有 1 秒,因此第三个任务会在第一个任务执行完毕后立即开始执行,不需要等待 2 秒钟的第二个任务执行完成。因此,第三个任务应该在第一个任务执行完成后的 3 秒钟后打印.

Leave a Comment

3 Comments
  1. 不错啊,相当于 Java 里边的线程池?

    1. @磊磊落落java没有涉及@(狂汗) 不知道线程池是啥概念😂

  2. \#(击掌)