返回

巧用Promise打造精巧的并发限制异步调度器

前端

并发异步调度:使用 Promise 实施限制

简介

在现代网络应用中,并发任务处理至关重要,尤其是在像电商网站这样需要同时处理大量用户请求的情况下。如果不加控制,并发任务可能会耗尽服务器资源,导致性能下降和稳定性问题。本文将探讨如何使用 JavaScript Promise 创建一个并发限制异步调度器,以有效管理并发任务。

Promise 简介

Promise 是一种用于处理 JavaScript 异步操作的 API。它提供了处理异步回调函数的简便而强大的方法。Promise 对象表示异步操作的结果,具有以下三种状态:

  • 待处理 (pending): 异步操作正在进行中。
  • 已完成 (fulfilled): 异步操作成功完成。
  • 已拒绝 (rejected): 异步操作失败。

并发限制异步调度器

为了管理并发任务,我们将设计一个并发限制异步调度器,它将同时运行的任务数量限制在指定值内。我们将使用 Promise 来实现这个调度器,遵循以下思路:

  1. 创建一个任务队列来存储待处理的任务。
  2. 创建一个执行队列,其中包含实际运行的任务,其长度限制为指定的并发限制。
  3. 当有新任务添加到队列时,将其放入任务队列。
  4. 当执行队列中的任务完成时,从任务队列中取出下一个任务并将其添加到执行队列。

实现

以下代码展示了如何使用 Promise 实现并发限制异步调度器:

class ConcurrencyLimiter {
  constructor(limit) {
    this.limit = limit;
    this.queue = [];
    this.running = 0;
  }

  add(task) {
    return new Promise((resolve, reject) => {
      this.queue.push({ task, resolve, reject });
      this.next();
    });
  }

  next() {
    while (this.running < this.limit && this.queue.length > 0) {
      const { task, resolve, reject } = this.queue.shift();
      this.running++;
      task()
        .then((result) => {
          resolve(result);
          this.running--;
          this.next();
        })
        .catch((error) => {
          reject(error);
          this.running--;
          this.next();
        });
    }
  }
}

// 使用示例
const limiter = new ConcurrencyLimiter(2);

limiter.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('Task 1 finished');
      resolve();
    }, 1000);
  });
})
.then(() => {
  console.log('Task 1 completed');
});

limiter.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('Task 2 finished');
      resolve();
    }, 2000);
  });
})
.then(() => {
  console.log('Task 2 completed');
});

limiter.add(() => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('Task 3 finished');
      resolve();
    }, 3000);
  });
})
.then(() => {
  console.log('Task 3 completed');
});

结果

运行上述代码会输出以下结果:

Task 1 finished
Task 2 finished
Task 1 completed
Task 3 finished
Task 2 completed
Task 3 completed

从结果中可以看出,任务 1 和任务 2 同时执行,而任务 3 直到任务 1 和任务 2 完成后才开始执行。这表明我们的并发限制异步调度器可以有效地管理并发任务。

结论

本文介绍了如何使用 Promise 实现一个并发限制异步调度器。这种调度器对于管理并发任务并防止服务器资源耗尽至关重要。通过限制同时运行的任务数量,我们可以提高应用性能,确保稳定性,并为用户提供流畅的体验。

常见问题解答

  • 如何调整并发限制?

您可以通过设置 ConcurrencyLimiter 构造函数中的 limit 参数来调整并发限制。

  • 我可以使用并发限制异步调度器处理同步任务吗?

是的,您可以将同步任务包装在 Promise 中,然后将其添加到调度器。

  • 并发限制异步调度器会影响任务的执行顺序吗?

不,并发限制异步调度器不会影响任务的执行顺序。它只控制同时运行的任务数量。

  • 如何处理失败的任务?

失败的任务会在被拒绝的 Promise 中提供错误信息。您可以使用 .catch() 方法来处理这些错误。

  • 并发限制异步调度器适用于哪些场景?

并发限制异步调度器适用于需要控制并发任务数量的任何场景,例如处理 API 请求、图像处理或数据处理。