¿Cuándo usar Worker Threads?
Node.js es single‑threaded para JavaScript. Cuando tienes tareas CPU intensivas, los worker threads permiten paralelizar sin bloquear el event loop.
Ejemplo básico
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename, { workerData: 42 });
worker.on('message', (result) => console.log('Resultado:', result));
} else {
const result = workerData * 2;
parentPort.postMessage(result);
}
Pasar datos grandes
const { Worker } = require('worker_threads');
const buffer = new SharedArrayBuffer(1024);
const view = new Uint8Array(buffer);
const worker = new Worker('./worker.js', { workerData: buffer });
view[0] = 7;
SharedArrayBuffer permite compartir memoria sin copiar.
Pool de workers
class WorkerPool {
constructor(size, filename) {
this.workers = Array.from({ length: size }, () => new Worker(filename));
this.queue = [];
this.idle = [...this.workers];
}
runTask(data) {
return new Promise((resolve) => {
const task = { data, resolve };
this.queue.push(task);
this._next();
});
}
_next() {
if (!this.idle.length || !this.queue.length) return;
const worker = this.idle.pop();
const task = this.queue.shift();
worker.once('message', (result) => {
task.resolve(result);
this.idle.push(worker);
this._next();
});
worker.postMessage(task.data);
}
}
💡 Consejos
- ✓ Usa workers para CPU pesado, no para I/O
- ✓ Evita crear demasiados threads
- ✓ Reutiliza workers con un pool
- ✓ Controla límites de memoria