返回

并发任务控制之异步任务

前端

并发任务控制的概念

并发任务控制是指在计算机程序中,对多个任务同时执行的控制。并发任务控制可以提高程序的效率,因为多个任务可以同时执行,而不必等待单个任务执行完成。

并发任务控制有两种主要类型:并行任务控制和异步任务控制。

  • 并行任务控制 是指多个任务同时执行,并且这些任务相互独立,不会相互影响。
  • 异步任务控制 是指多个任务同时执行,但这些任务相互依赖,必须按顺序执行。

如何在前端实现一个异步任务

在前端,可以使用 Promise 和 Async/Await 来实现异步任务。

Promise 是一个对象,它表示一个异步操作的最终完成(或失败)及其结果值。Promise 可以被用来在异步操作完成后执行回调函数。

Async/Await 是 ES8 中引入的语法,它允许我们使用同步的方式来编写异步代码。Async/Await 函数可以暂停执行,直到 Promise 完成,然后继续执行。

下面是一个在前端实现异步任务的示例:

// 定义一个异步函数
async function fetchUserData() {
  // 使用 await 暂停执行,直到 Promise 完成
  const response = await fetch('/user-data');
  // 将响应转换为 JSON 对象
  const data = await response.json();
  // 返回数据
  return data;
}

// 调用异步函数并处理结果
fetchUserData().then((data) => {
  // 使用数据
  console.log(data);
});

思考题

现在我们已经了解了什么是并发,以及为什么要控制并发。那么就让我们看下图中的一道题,来完成要求,实现一个异步任务的并发控制。

图中的题目要求我们实现一个异步任务的并发控制,其中任务的并发数限制为 3。我们可以使用 Promise 和 Async/Await 来实现这个并发控制。

// 定义一个并发控制函数
const并发控制= async (tasks, limit) => {
  // 创建一个 Promise 数组
  const promises = [];
  // 创建一个正在执行的任务数计数器
  let running = 0;
  // 遍历任务
  for (const task of tasks) {
    // 如果正在执行的任务数小于限制,则执行任务
    if (running < limit) {
      running++;
      // 将任务包装成一个 Promise
      const promise = task();
      // 将 Promise 添加到 Promise 数组
      promises.push(promise);
      // 当任务完成时,减少正在执行的任务数
      promise.then(() => {
        running--;
      });
    } else {
      // 如果正在执行的任务数达到限制,则等待一个任务完成
      await Promise.race(promises);
      running--;
      // 执行任务
      const promise = task();
      // 将 Promise 添加到 Promise 数组
      promises.push(promise);
      // 当任务完成时,减少正在执行的任务数
      promise.then(() => {
        running--;
      });
    }
  }
  // 等待所有任务完成
  await Promise.all(promises);
};

// 定义一个异步任务函数
const task = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, 1000);
  });
};

// 创建一个任务数组
const tasks = [];
for (let i = 0; i < 10; i++) {
  tasks.push(task);
}

// 并发执行任务
并发控制(tasks, 3);

这段代码将创建一个并发控制函数,该函数可以限制并发任务数。然后,我们将创建一个任务数组,并将每个任务包装成一个 Promise。最后,我们将使用并发控制函数来并发执行任务。