当前位置:首页 > JavaScript

js实现并发量控制

2026-03-01 17:39:00JavaScript

实现并发量控制的方法

在JavaScript中实现并发量控制通常用于限制同时执行的异步任务数量,避免资源耗尽或服务器过载。以下是几种常见方法:

Promise.all + 分批次执行

将任务数组拆分为多个批次,每个批次使用Promise.all执行:

js实现并发量控制

async function batchTasks(tasks, concurrency) {
  const results = [];
  for (let i = 0; i < tasks.length; i += concurrency) {
    const batch = tasks.slice(i, i + concurrency);
    results.push(...await Promise.all(batch.map(fn => fn())));
  }
  return results;
}

自定义队列实现

创建一个任务队列,动态控制执行中的任务数量:

js实现并发量控制

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

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

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

async-pool库实现

使用现成的第三方库如async-pool

import asyncPool from 'tiny-async-pool';

const results = await asyncPool(5, urls, fetchUrl);

Promise.race动态控制

利用Promise.race动态管理执行池:

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

  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);
}

关键注意事项

  • 错误处理需要单独处理每个任务的失败情况,避免单个失败导致整个流程中断
  • 任务取消功能可以通过添加abort controller实现
  • 进度跟踪可以添加回调函数或事件机制
  • 浏览器环境需注意不同标签页的并发限制

以上方法可根据具体场景选择,简单的并发控制使用Promise.all分批处理即可,复杂场景建议使用队列实现或现成库。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js实现上传文件

js实现上传文件

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