当前位置:首页 > 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实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现复制到剪贴板

js实现复制到剪贴板

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

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…