当前位置:首页 > JavaScript

js 实现一个并发队列

2026-04-05 02:41:14JavaScript

实现并发队列的基本思路

在JavaScript中实现并发队列通常需要控制同时执行的异步任务数量。可以使用Promise和队列管理机制来实现这一功能。

定义并发队列类

创建一个ConcurrentQueue类,包含任务队列和并发控制逻辑。

js 实现一个并发队列

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();
      task().finally(() => {
        this.running--;
        this.next();
      });
      this.running++;
    }
  }
}

使用示例

创建并发队列实例并添加任务。

const queue = new ConcurrentQueue(2); // 并发数为2

// 模拟异步任务
function asyncTask(id, delay) {
  return () => new Promise(resolve => {
    console.log(`Task ${id} started`);
    setTimeout(() => {
      console.log(`Task ${id} completed`);
      resolve();
    }, delay);
  });
}

// 添加任务
queue.add(asyncTask(1, 2000));
queue.add(asyncTask(2, 1000));
queue.add(asyncTask(3, 1500));
queue.add(asyncTask(4, 500));

处理任务结果

如果需要获取任务结果,可以修改add方法返回Promise。

js 实现一个并发队列

class ConcurrentQueue {
  // ...其他代码同上

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

错误处理

确保任务失败时不会中断队列运行。

class ConcurrentQueue {
  // ...其他代码同上

  next() {
    while (this.running < this.concurrency && this.queue.length) {
      const task = this.queue.shift();
      task()
        .catch(error => console.error('Task failed:', error))
        .finally(() => {
          this.running--;
          this.next();
        });
      this.running++;
    }
  }
}

高级功能扩展

可以添加暂停、继续和清空队列等功能。

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

  pause() {
    this.paused = true;
  }

  resume() {
    this.paused = false;
    this.next();
  }

  clear() {
    this.queue = [];
  }

  // ...其他方法同上
}

性能考虑

对于大量任务,可以考虑使用链表代替数组实现队列,以提高shift操作性能。

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

相关文章

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…