当前位置:首页 > JavaScript

js 实现一个并发队列

2026-03-02 01:50:33JavaScript

并发队列的实现方法

在JavaScript中实现并发队列可以通过多种方式完成,通常需要结合Promise、async/await以及队列管理机制。以下是几种常见的实现方法。

使用Promise和async/await

通过Promise和async/await可以方便地控制并发任务的执行顺序和并发数量。

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

使用async库

async库提供了多种并发控制方法,如parallelLimitqueue,可以简化并发队列的实现。

const async = require('async');

const queue = async.queue((task, callback) => {
  task().then(() => callback()).catch(callback);
}, concurrencyLimit);

queue.drain = () => {
  console.log('All tasks completed');
};

tasks.forEach(task => queue.push(task));

使用Worker Threads

对于CPU密集型任务,可以使用Node.js的Worker Threads实现真正的并行处理。

js 实现一个并发队列

const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  const worker = new Worker(__filename);
  worker.postMessage('task data');
} else {
  parentPort.on('message', (msg) => {
    // Process task
    parentPort.postMessage('result');
  });
}

使用事件驱动机制

通过事件驱动机制可以实现任务的动态调度和并发控制。

const EventEmitter = require('events');

class TaskQueue extends EventEmitter {
  constructor(concurrency) {
    super();
    this.concurrency = concurrency;
    this.running = 0;
    this.queue = [];
  }

  push(task) {
    this.queue.push(task);
    process.nextTick(() => this.next());
    return this;
  }

  next() {
    if (this.running >= this.concurrency || !this.queue.length) return;
    const task = this.queue.shift();
    task(() => {
      this.running--;
      this.next();
    });
    this.running++;
    this.next();
  }
}

使用生成器函数

生成器函数可以用于控制任务的执行顺序和并发数量。

function* taskGenerator(tasks) {
  for (const task of tasks) {
    yield task();
  }
}

const tasks = [/* array of async functions */];
const gen = taskGenerator(tasks);

function run(concurrency) {
  for (let i = 0; i < concurrency; i++) {
    const { value, done } = gen.next();
    if (done) break;
    value.then(() => run(1));
  }
}

run(concurrencyLimit);

注意事项

  • 确保任务错误被正确处理,避免未捕获的Promise rejection。
  • 根据任务类型选择合适的并发控制方法,IO密集型任务和CPU密集型任务可能需要不同的策略。
  • 监控队列状态,避免内存泄漏或任务堆积。

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

相关文章

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现论坛

js实现论坛

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

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…