当前位置:首页 > 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轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js 实现日历

js 实现日历

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

js实现导航菜单

js实现导航菜单

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

js实现音乐播放

js实现音乐播放

使用HTML5 Audio API实现音乐播放 在JavaScript中,可以通过HTML5的Audio API轻松实现音乐播放功能。以下是基本实现方法: // 创建Audio对象 const au…

vue.js实现checkbox

vue.js实现checkbox

使用 v-model 绑定复选框 在 Vue.js 中,可以通过 v-model 指令实现复选框的双向数据绑定。复选框的值会与 Vue 实例中的数据属性同步。 <template>…