当前位置:首页 > JavaScript

js实现线程池

2026-02-02 17:42:53JavaScript

js实现线程池

实现线程池的基本思路

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

创建Worker管理类

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

  initWorkers() {
    for (let i = 0; i < this.poolSize; i++) {
      const worker = new Worker(this.workerScript)
      worker.onmessage = (e) => {
        this.handleWorkerResponse(worker, e.data)
      }
      this.workers.push(worker)
    }
  }
}

任务队列处理

class WorkerPool {
  // ... 其他代码

  enqueueTask(taskData) {
    return new Promise((resolve, reject) => {
      this.taskQueue.push({ taskData, resolve, reject })
      this.processNextTask()
    })
  }

  processNextTask() {
    if (this.taskQueue.length === 0) return

    const availableWorker = this.workers.find(w => !w.busy)
    if (!availableWorker) return

    const nextTask = this.taskQueue.shift()
    availableWorker.busy = true
    availableWorker.currentTask = nextTask
    availableWorker.postMessage(nextTask.taskData)
  }
}

处理Worker响应

class WorkerPool {
  // ... 其他代码

  handleWorkerResponse(worker, response) {
    const { resolve } = worker.currentTask
    worker.busy = false
    worker.currentTask = null
    resolve(response)
    this.processNextTask()
  }
}

终止Worker池

class WorkerPool {
  // ... 其他代码

  terminate() {
    this.workers.forEach(worker => worker.terminate())
    this.workers = []
    this.taskQueue = []
  }
}

使用示例

// worker.js
self.onmessage = function(e) {
  const result = e.data * 2 // 示例计算
  postMessage(result)
}

// main.js
const pool = new WorkerPool(4, 'worker.js')

pool.enqueueTask(10).then(result => {
  console.log(result) // 20
})

// 使用完毕后
// pool.terminate()

优化方向

  1. 错误处理:在Worker中添加错误监听,并在主线程中处理
  2. 任务优先级:实现优先级队列而非简单的FIFO
  3. 超时机制:为任务添加超时处理
  4. 负载均衡:根据任务复杂度动态分配Worker

这种实现方式适用于CPU密集型任务,可以充分利用多核CPU的计算能力。对于IO密集型任务,JavaScript的异步模型通常已经足够高效。

js实现线程池

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

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现继承

js实现继承

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

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js实现乘

js实现乘

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