js实现并发量控制
实现并发量控制的方法
在JavaScript中实现并发量控制通常用于限制同时执行的异步任务数量,避免资源耗尽或服务器过载。以下是几种常见方法:
Promise.all + 分批次执行
将任务数组拆分为多个批次,每个批次使用Promise.all执行:

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;
}
自定义队列实现
创建一个任务队列,动态控制执行中的任务数量:

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分批处理即可,复杂场景建议使用队列实现或现成库。






