87 lines
2.4 KiB
JavaScript
87 lines
2.4 KiB
JavaScript
import { Worker } from 'worker_threads';
|
||
|
||
// 创建固定大小的线程池(6个线程)
|
||
class TaskThreadPool {
|
||
constructor(size = 1) {
|
||
this.size = size; // 线程池大小,默认为6
|
||
this.workers = []; // 存储worker对象的数组
|
||
this.taskQueue = []; // 任务队列,存储等待处理的任务
|
||
this.initWorkers(); // 初始化worker线程
|
||
}
|
||
|
||
initWorkers() {
|
||
for (let i = 0; i < this.size; i++) {
|
||
const worker = new Worker(new URL('./generatTask.js', import.meta.url)); // 创建指向generatTask.js的worker
|
||
this.workers.push({
|
||
worker, // worker对象
|
||
busy: false // 是否正在处理任务的标志
|
||
});
|
||
}
|
||
}
|
||
|
||
async executeTask(taskBatch) {
|
||
return new Promise((resolve, reject) => {
|
||
// 寻找空闲的worker
|
||
const availableWorker = this.workers.find(w => !w.busy);
|
||
|
||
if (availableWorker) {
|
||
// 有空闲worker,直接执行任务
|
||
this.runTaskOnWorker(availableWorker, taskBatch, resolve, reject);
|
||
} else {
|
||
// 没有空闲worker,将任务加入队列
|
||
this.taskQueue.push({ taskBatch, resolve, reject });
|
||
}
|
||
});
|
||
}
|
||
|
||
runTaskOnWorker(workerObj, taskBatch, resolve, reject) {
|
||
workerObj.busy = true;
|
||
|
||
workerObj.worker.once('message', (result) => {
|
||
workerObj.busy = false;
|
||
resolve(result);
|
||
|
||
// 检查是否有排队的任务
|
||
this.processQueuedTasks();
|
||
});
|
||
|
||
workerObj.worker.once('error', (error) => {
|
||
workerObj.busy = false;
|
||
reject(error);
|
||
|
||
// 检查是否有排队的任务
|
||
this.processQueuedTasks();
|
||
});
|
||
|
||
workerObj.worker.postMessage(taskBatch);
|
||
}
|
||
|
||
processQueuedTasks() {
|
||
if (this.taskQueue.length > 0) {
|
||
const availableWorker = this.workers.find(w => !w.busy);
|
||
if (availableWorker) {
|
||
const queuedTask = this.taskQueue.shift();
|
||
this.runTaskOnWorker(
|
||
availableWorker,
|
||
queuedTask.taskBatch,
|
||
queuedTask.resolve,
|
||
queuedTask.reject
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
async executeAllTasks(taskBatches) {
|
||
const promises = taskBatches.map(batch => this.executeTask(batch));
|
||
return Promise.all(promises);
|
||
}
|
||
|
||
// 清理资源
|
||
terminate() {
|
||
this.workers.forEach(({ worker }) => {
|
||
worker.terminate();
|
||
});
|
||
}
|
||
}
|
||
|
||
export default new TaskThreadPool(); |