当前位置:首页 > JavaScript

js实现线程池

2026-03-15 18:00:11JavaScript

实现线程池的基本思路

JavaScript本身是单线程的,但可以通过Web Workers实现多线程。线程池的核心是管理一组Worker线程,避免频繁创建销毁的开销。

创建Worker线程池

定义一个WorkerPool类,初始化时创建固定数量的Worker实例:

class WorkerPool {
  constructor(poolSize, workerScript) {
    this.poolSize = poolSize;
    this.workerScript = workerScript;
    this.workers = [];
    this.taskQueue = [];

    for (let i = 0; i < poolSize; i++) {
      this.createWorker();
    }
  }

  createWorker() {
    const worker = new Worker(this.workerScript);
    worker.busy = false;
    this.workers.push(worker);
  }
}

任务分配机制

实现任务队列和Worker状态管理:

assignTask(taskData) {
  return new Promise((resolve, reject) => {
    const availableWorker = this.workers.find(w => !w.busy);

    if (availableWorker) {
      this.executeTask(availableWorker, taskData, resolve, reject);
    } else {
      this.taskQueue.push({ taskData, resolve, reject });
    }
  });
}

executeTask(worker, taskData, resolve, reject) {
  worker.busy = true;

  worker.onmessage = (e) => {
    resolve(e.data);
    worker.busy = false;
    this.processNextTask();
  };

  worker.onerror = (e) => {
    reject(e);
    worker.busy = false;
    this.processNextTask();
  };

  worker.postMessage(taskData);
}

任务队列处理

当Worker空闲时从队列中取出任务执行:

processNextTask() {
  if (this.taskQueue.length > 0) {
    const { taskData, resolve, reject } = this.taskQueue.shift();
    const availableWorker = this.workers.find(w => !w.busy);
    if (availableWorker) {
      this.executeTask(availableWorker, taskData, resolve, reject);
    }
  }
}

使用示例

创建线程池并提交任务:

// worker.js 文件内容
self.onmessage = function(e) {
  // 执行计算密集型任务
  const result = heavyComputation(e.data);
  postMessage(result);
};

// 主线程
const pool = new WorkerPool(4, 'worker.js');

pool.assignTask(inputData)
  .then(result => console.log(result))
  .catch(err => console.error(err));

性能优化建议

设置任务超时机制避免长时间阻塞:

executeTask(worker, taskData, resolve, reject) {
  const timeoutId = setTimeout(() => {
    worker.terminate();
    this.createWorker(); // 替换超时Worker
    reject(new Error('Task timeout'));
  }, 5000);

  worker.onmessage = (e) => {
    clearTimeout(timeoutId);
    resolve(e.data);
    worker.busy = false;
    this.processNextTask();
  };

  // ...其他代码
}

实现动态扩容机制:

js实现线程池

checkWorkload() {
  const busyCount = this.workers.filter(w => w.busy).length;
  if (busyCount === this.poolSize && this.poolSize < MAX_POOL_SIZE) {
    this.createWorker();
    this.poolSize++;
  }
}

注意事项

Web Worker之间不能共享内存,所有通信需要通过postMessage传递可序列化数据。线程池适合CPU密集型任务,对于IO密集型任务效果不明显。

标签: 线程js
分享给朋友:

相关文章

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现乘

js实现乘

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

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…