当前位置:首页 > 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 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置…

js jquery

js jquery

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

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…