当前位置:首页 > JavaScript

js 实现一个并发队列

2026-01-31 10:34:45JavaScript

实现并发队列的基本思路

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

注意事项

实现并发队列时需考虑:

  • 内存泄漏风险(长时间运行的应用)
  • 错误处理机制
  • 任务取消功能
  • 性能监控

以上实现提供了基本框架,可根据具体需求进行扩展和优化。

js 实现一个并发队列

标签: 队列js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue…

js 实现vue模板

js 实现vue模板

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

js实现图片上传

js实现图片上传

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

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML…