当前位置:首页 > JavaScript

js实现并发量控制

2026-01-31 02:34:23JavaScript

并发量控制的实现方法

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

Promise队列与并发控制

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

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函数和队列管理:

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可直接使用:

js实现并发量控制

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
分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Pro…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…