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()
优化方向
- 错误处理:在Worker中添加错误监听,并在主线程中处理
- 任务优先级:实现优先级队列而非简单的FIFO
- 超时机制:为任务添加超时处理
- 负载均衡:根据任务复杂度动态分配Worker
这种实现方式适用于CPU密集型任务,可以充分利用多核CPU的计算能力。对于IO密集型任务,JavaScript的异步模型通常已经足够高效。







