当前位置:首页 > JavaScript

js实现线程池

2026-02-02 17:42:53JavaScript

实现线程池的基本思路

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

js实现线程池

创建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实现倒计时

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…