js 实现一个并发队列
实现并发队列的基本思路
在JavaScript中实现并发队列,通常需要控制同时执行的异步任务数量。可以通过队列管理待执行任务,并结合Promise和计数器实现并发控制。
基于Promise的并发队列实现
class ConcurrentQueue {
constructor(concurrency) {
this.concurrency = concurrency;
this.running = 0;
this.queue = [];
}
add(task) {
this.queue.push(task);
this.next();
}
next() {
while (this.running < this.concurrency && this.queue.length) {
const task = this.queue.shift();
this.running++;
task().finally(() => {
this.running--;
this.next();
});
}
}
}
使用示例
// 创建并发数为2的队列
const queue = new ConcurrentQueue(2);
// 模拟异步任务
function asyncTask(id, delay) {
return () => new Promise(resolve => {
console.log(`开始任务 ${id}`);
setTimeout(() => {
console.log(`完成任务 ${id}`);
resolve();
}, delay);
});
}
// 添加任务
queue.add(asyncTask(1, 1000));
queue.add(asyncTask(2, 1500));
queue.add(asyncTask(3, 500));
queue.add(asyncTask(4, 2000));
高级功能扩展
对于更复杂的需求,可以扩展以下功能:
- 任务优先级处理
- 错误重试机制
- 任务进度跟踪
- 暂停/恢复功能
使用async库的替代方案
如果不想手动实现,可以使用现成的库如async:
const async = require('async');
// 并发控制示例
async.parallelLimit([
callback => setTimeout(() => callback(null, '任务1'), 1000),
callback => setTimeout(() => callback(null, '任务2'), 1500),
callback => setTimeout(() => callback(null, '任务3'), 500)
], 2, (err, results) => {
console.log(results);
});
注意事项
实现并发队列时需考虑:
- 内存泄漏风险(长时间运行的应用)
- 错误处理机制
- 任务取消功能
- 性能监控
以上实现提供了基本框架,可根据具体需求进行扩展和优化。







