Saltar al contenido

Node.js Spawn vs. Ejecutar

Intenta comprender el código de forma correcta antes de adaptarlo a tu trabajo si ttienes algo que aportar puedes compartirlo con nosotros.

Solución:

La principal diferencia es la spawn es más adecuado para procesos de larga duración con un gran rendimiento. spawn transmite entrada/salida con proceso hijo. exec salida almacenada en un búfer pequeño (por defecto 200K). También como sé exec primero genere subshell, luego intente ejecutar su proceso. Para acortar el uso de la historia corta spawn en caso de que necesite una gran cantidad de datos transmitidos desde un proceso secundario y exec si necesita funciones como shell pipes, redireccionamientos o incluso si necesita ejecutar más de un programa a la vez.

Algunos enlaces útiles – DZone Hacksparrow

  • proceso hijo creado por spawn()

    • no genera un caparazón
    • transmite los datos devueltos por el proceso secundario (el flujo de datos es constante)
    • no tiene límite de tamaño de transferencia de datos
  • proceso hijo creado por exec()

    • genera un shell en el que se ejecuta el comando pasado
    • almacena en búfer los datos (espera hasta que el proceso se cierra y transfiere los datos en un fragmento)
    • transferencia máxima de datos 200kb (por defecto)

-main.js (archivo)

var spawn, exec = require('child_process');

    // 'node' is an executable command (can be executed without a shell) 
    // uses streams to transfer data (spawn.stout)  
var spawn = spawn('node', ['module.js']);     
spawn.stdout.on('data', function(msg)         
    console.log(msg.toString())
);

    // the 'node module.js' runs in the spawned shell 
    // transfered data is handled in the callback function 
var exec = exec('node module.js', function(err, stdout, stderr)
    console.log(stdout);
);

-module.js (básicamente devuelve un mensaje cada segundo durante 5 segundos antes de salir)

var interval;
interval = setInterval(function()
    console.log( 'module data' );
    if(interval._idleStart > 5000) clearInterval(interval);
, 1000);
  • el spawn() proceso hijo devuelve el mensaje module data cada 1 segundo durante 5 segundos, porque los datos se ‘transmiten’
  • el exec() proceso hijo devuelve un solo mensaje module data module data module data module data module data después de 5 segundos (cuando se cierra el proceso) esto se debe a que los datos están “almacenados”

TENGA EN CUENTA que ni el spawn() ni el exec() Los procesos secundarios están diseñados para ejecutar módulos de nodo, esta demostración es solo para mostrar la diferencia (si desea ejecutar módulos de nodo como procesos secundarios, use el fork() método en su lugar)

Un buen lugar para comenzar es la documentación de NodeJS.

Para ‘generar’ el estado de la documentación:

El método child_process.spawn() genera un nuevo proceso usando el comando dado, con argumentos de línea de comando en args. Si se omite, args por defecto es un vacío array.

Mientras que para ‘ejec’:

Genera un shell y luego ejecuta el comando dentro de ese shell, almacenando en búfer cualquier salida generada. El comando string pasado a la función exec es procesado directamente por el shell y los caracteres especiales (varían según el shell) deben tratarse en consecuencia.

Lo principal parece ser si necesita manejar la salida del comando o no, lo que imagino podría ser el factor que afecta el rendimiento (no lo he comparado). Si solo le importa la finalización del proceso, y no su resultado, entonces ‘spawn’ parecería ser suficiente.

Sección de Reseñas y Valoraciones

Si te sientes suscitado, puedes dejar una noticia acerca de qué le añadirías a este ensayo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *