TechLead
Lección 3 de 8
5 min de lectura
Node.js Avanzado

Worker Threads

Ejecuta tareas CPU intensivas en hilos separados

¿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

Sigue aprendiendo