js实现线程池
实现线程池的基本思路
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();
};
// ...其他代码
}
实现动态扩容机制:

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密集型任务效果不明显。






