Si tu API de Node.js se congela, normalmente no es porque «Node sea lento». Es por trabajo pesado del sistema operativo y un control asíncrono mal resuelto.

Dos errores clásicos:

  • Usar exec() para tareas grandes
  • Dejar que las promesas y los procesos sigan para siempre

Problema #1: exec() consume memoria

exec() acumula toda la salida en memoria. Los PDF grandes, los videos o los registros pueden:

  • Disparar el uso de RAM
  • Bloquear el bucle de eventos
  • Congelar tu API

Problema #2: promesas que nunca se detienen ☠️

Incluso con spawn podés desperdiciar CPU si:

  • Usás Promise.race() sin detener la tarea que pierde
  • Resolvés o rechazás una promesa, pero dejás el proceso ejecutándose
  • Te olvidás de los tiempos de espera o del manejo de señales

El resultado: procesos que quedan vivos y consumen CPU.

La forma correcta: spawn y control del ciclo de vida

Un ejemplo con un comando de consola sencillo, ffmpeg, aunque esto aplica a cualquier herramienta:

const { spawn } = require('child_process');

function convertVideo(input, output, timeout = 15000) {
  return new Promise((resolve, reject) => {
    const ffmpeg = spawn('ffmpeg', ['-i', input, output]);

    const timer = setTimeout(() => {
      ffmpeg.kill('SIGKILL'); // kill the real work
      reject(new Error('Conversion timed out'));
    }, timeout);

    ffmpeg.on('close', code => {
      clearTimeout(timer);

      if (code === 0) {
        resolve();
      } else {
        reject(new Error(`ffmpeg failed (${code})`));
      }
    });

    ffmpeg.on('error', reject);
  });
}

Esto busca asegurar:

  • Que la salida no se acumule en un búfer como ocurre con exec
  • Que no queden promesas pendientes
  • Que el trabajo no siga consumiendo CPU sin control

spawn frente a fork

  • Usá spawn para herramientas de consola: ffmpeg, git, docker, gs o python
  • Usá fork solamente para otro proceso de Node.js con comunicación entre procesos, o IPC

Para recordar

Las aplicaciones de Node que se congelan no tienen solamente un problema de memoria. Tienen un problema de control.

  • Procesá el trabajo pesado con spawn
  • Siempre resolvé o rechazá la promesa
  • Detené lo que iniciás

¡No te olvides!