当前位置:首页 > JavaScript

js 实现一个并发队列

2026-04-05 02:41:14JavaScript

实现并发队列的基本思路

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

定义并发队列类

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

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。

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++;
    }
  }
}

高级功能扩展

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

js 实现一个并发队列

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
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

php 队列的实现

php 队列的实现

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