Worker pool — manage multiple workers for parallel processing.
1const { Worker } = require("worker_threads");23class WorkerPool {4 constructor(workerScript, poolSize = 4) {5 this.workerScript = workerScript;6 this.poolSize = poolSize;7 this.workers = [];8 this.queue = [];9 this.init();10 }1112 init() {13 for (let i = 0; i < this.poolSize; i++) {14 this.createWorker();15 }16 }1718 createWorker() {19 const worker = new Worker(this.workerScript);20 worker.busy = false;2122 worker.on("message", (result) => {23 worker.busy = false;24 worker.resolve(result);25 this.processQueue();26 });2728 worker.on("error", (err) => {29 worker.busy = false;30 worker.reject(err);31 this.processQueue();32 });3334 this.workers.push(worker);35 }3637 runTask(data) {38 return new Promise((resolve, reject) => {39 const worker = this.workers.find(w => !w.busy);4041 if (worker) {42 worker.busy = true;43 worker.resolve = resolve;44 worker.reject = reject;45 worker.postMessage(data);46 } else {47 this.queue.push({ data, resolve, reject });48 }49 });50 }5152 processQueue() {53 if (this.queue.length === 0) return;5455 const worker = this.workers.find(w => !w.busy);56 if (!worker) return;5758 const task = this.queue.shift();59 worker.busy = true;60 worker.resolve = task.resolve;61 worker.reject = task.reject;62 worker.postMessage(task.data);63 }6465 async destroy() {66 for (const worker of this.workers) {67 await worker.terminate();68 }69 }70}7172// Usage73const pool = new WorkerPool("./heavy-task.js", 4);74const results = await Promise.all([75 pool.runTask({ input: 1 }),76 pool.runTask({ input: 2 }),77 pool.runTask({ input: 3 }),78 pool.runTask({ input: 4 }),79]);