4 min de lectura

El módulo de procesos secundarios de Node.js (child_process)

El módulo de procesos secundarios de Node.js (child_process) tiene dos funciones spawn y exec, mediante las cuales podemos iniciar un proceso secundario para ejecutar otros programas en el sistema.

Si esta es tu primera vez trabajando con child_process te podrá parecer extraño que existan dos funciones para hacer lo mismo, y entonces surge la duda ¿cuál deberías usar?.

 

La diferencia más significativa entre child_process.spawn y child_process.exec está en lo que spawn devuelve un stream y exec devuelve un buffer.

 

Qué es un stream

En español se traduce como flujo o secuencia. Para propósitos educativos, no lo traduciré, por lo que en este artículo usaré el término stream.

El módulo stream en NodeJs es una interfaz abstracta para trabajar con datos de transmisión.

Los streams pueden ser de lectura, escritura o ambos y tienen múltiples eventos.

Qué es un buffer

En español se traduce como búfer. Para propósitos educativos, no lo traduciré, por lo que en este artículo usaré el término buffer.

La clase Buffer se introdujo como parte de la API de Node.js para permitir la interacción con flujos de octetos en flujos TCP, operaciones del sistema de archivos y otros contextos.

Las instancias de la clase Buffer son similares a las matrices de enteros, pero corresponden a asignaciones de memoria sin formato de tamaño fijo fuera de la pila de V8. El tamaño del buffer se establece cuando se crea y no se puede cambiar.

 

Diferencia entre spawn y exec

La diferencia entre spawn y exec está en lo que devuelven:

  • spawn devuelve un stream
  • exec devuelve un buffer

spawn devuelve un objeto con stdout y stderr streams, de modo que puedes usar el stream de stdout para leer los datos que el proceso secundario envía de vuelta a Node.

 

stdout, además, es un stream que tiene “data”, “end” y otros eventos que tienen todos los stream.

 

spawn se utiliza mejor cuando se desea que el proceso hijo devuelva una gran cantidad de datos a Node, cosas como procesamiento de imágenes, lectura de datos binarios, etc.

spawn es “asincrónicamente asíncrono”, lo que significa que comienza a enviar datos desde el proceso hijo en un stream tan pronto como el proceso hijo comienza a ejecutarse.

exec devuelve toda la salida del buffer del proceso hijo. Por defecto, el tamaño del búfer se establece en 200k. Si el proceso hijo devuelve algo más que eso, el programa se bloqueará con el mensaje de error “Error: maxBuffer exceeded”. Podrías solucionar el problema estableciendo un tamaño de buffer más grande en las opciones de ejecución, pero no tiene sentido que lo hagas ya que exec no está diseñado para procesos que devuelven buffers muy grandes a Node. Deberías usar spawn para eso.

Siedo así, entonces exec deberías usarlo para ejecutar programas que devuelven estados de resultados, en lugar de datos.

 

exec es “asíncrono sincrónicamente”, lo que significa que aunque exec es asíncrono, espera que el proceso hijo finalice e intenta devolver todos los datos almacenados en el buffer de una sola la vez. Si el tamaño del buffer de exec no está configurado lo suficientemente grande, falla con un error “maxBuffer exceeded”.

 

En resumen, la diferencia entre spawn y exec

  • Usa spawn cuando quieras que el proceso hijo devuelva datos binarios enormes a Node.
  • Usa exec cuando quieras que el proceso hijo devuelva mensajes de estado simples.
  • Usa spawn cuando quieras recibir datos desde que el proceso arranca.
  • Usa exec cuando solo quieras recibir datos al final de la ejecución.

 

 

 
¿Te gustó este artículo?

Si te gustó este artículo, te ha servido o aprendiste algo nuevo; compártelo en tus redes sociales o invítame un cafe.

Deja tus comentarios

This site uses Akismet to reduce spam. Learn how your comment data is processed.