当前位置:首页 > JavaScript

js实现并发量控制

2026-01-31 02:34:23JavaScript

并发量控制的实现方法

在JavaScript中实现并发量控制的核心思路是通过队列管理任务,限制同时执行的任务数量。以下是几种常见方法:

Promise队列与并发控制

利用Promise和队列机制控制并发:

js实现并发量控制

class ConcurrencyControl {
  constructor(maxConcurrent) {
    this.maxConcurrent = maxConcurrent;
    this.queue = [];
    this.running = 0;
  }

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

  run() {
    while (this.queue.length > 0 && this.running < this.maxConcurrent) {
      const { task, resolve, reject } = this.queue.shift();
      this.running++;
      Promise.resolve(task())
        .then(resolve)
        .catch(reject)
        .finally(() => {
          this.running--;
          this.run();
        });
    }
  }
}

使用方法:

const controller = new ConcurrencyControl(3);
// 添加任务
controller.add(() => fetch('/api1')).then(console.log);
controller.add(() => fetch('/api2')).then(console.log);

async/await实现

通过async函数和队列管理:

js实现并发量控制

async function parallelLimit(tasks, limit) {
  const results = [];
  const executing = new Set();

  for (const task of tasks) {
    const p = task().then(res => {
      executing.delete(p);
      return res;
    });
    executing.add(p);
    results.push(p);

    if (executing.size >= limit) {
      await Promise.race(executing);
    }
  }
  return Promise.all(results);
}

使用方法:

const tasks = [/* 多个返回Promise的函数 */];
parallelLimit(tasks, 2).then(console.log);

使用第三方库

现有库如p-limit可直接使用:

import pLimit from 'p-limit';

const limit = pLimit(2); // 并发数为2
const tasks = [
  limit(() => fetch('/api1')),
  limit(() => fetch('/api2'))
];
Promise.all(tasks).then(console.log);

注意事项

  • 错误处理需在任务内部或调用处捕获
  • 任务完成后需及时释放并发槽位
  • 浏览器环境需考虑请求取消(AbortController)
  • Node.js环境可结合worker_threads实现真正并行

以上方法可根据实际场景选择,核心思想均为通过队列和Promise状态管理控制并发流程。

标签: js
分享给朋友:

相关文章

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…