js实现线程池
实现线程池的基本概念
JavaScript 是单线程语言,但通过 Web Workers 可以实现多线程。线程池(Thread Pool)是一种管理多个 Worker 线程的机制,用于优化资源利用和任务调度。

使用 Web Workers 创建线程池
Web Workers 允许在后台运行脚本,独立于主线程。以下是一个简单的线程池实现:

class ThreadPool {
constructor(size) {
this.size = size;
this.workers = [];
this.taskQueue = [];
this.initializeWorkers();
}
initializeWorkers() {
for (let i = 0; i < this.size; i++) {
const worker = new Worker('worker.js');
worker.onmessage = (event) => {
this.handleWorkerResponse(worker, event);
};
this.workers.push(worker);
}
}
handleWorkerResponse(worker, event) {
const taskCallback = this.taskQueue.shift();
if (taskCallback) {
worker.postMessage(taskCallback.data);
}
}
executeTask(data, callback) {
if (this.workers.length > 0) {
const worker = this.workers.pop();
worker.postMessage(data);
worker.onmessage = (event) => {
callback(event.data);
this.workers.push(worker);
this.processQueue();
};
} else {
this.taskQueue.push({ data, callback });
}
}
processQueue() {
if (this.taskQueue.length > 0 && this.workers.length > 0) {
const { data, callback } = this.taskQueue.shift();
this.executeTask(data, callback);
}
}
}
Worker 脚本示例
创建 worker.js 文件,用于处理实际任务:
self.onmessage = function(event) {
const result = performTask(event.data);
self.postMessage(result);
};
function performTask(data) {
// 模拟耗时任务
return data * 2;
}
使用线程池
在主线程中初始化并使用线程池:
const pool = new ThreadPool(4);
pool.executeTask(10, (result) => {
console.log('Task result:', result);
});
pool.executeTask(20, (result) => {
console.log('Task result:', result);
});
优化线程池
- 错误处理:添加 Worker 的
onerror事件处理,确保任务失败时有备用方案。 - 任务优先级:扩展
taskQueue支持优先级队列,高优先级任务优先执行。 - 动态调整:根据系统负载动态增加或减少 Worker 数量。
注意事项
- Web Workers 不能直接操作 DOM,需通过
postMessage通信。 - 大量 Worker 可能消耗较多内存,需合理设置池大小。
- 部分浏览器可能限制同时激活的 Worker 数量。






