当前位置:首页 > JavaScript

js 实现一个并发队列

2026-03-02 01:50:33JavaScript

并发队列的实现方法

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

使用Promise和async/await

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

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实现真正的并行处理。

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实现选项卡

js实现选项卡

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在H…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #34…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化…