Node.js Spawn vs. Execute
child process created by
spawn()
- does not spawn a shell
- streams the data returned by the child process (data flow is constant)
- has no data transfer size limit
child process created by
exec()
- does spawn a shell in which the passed command is executed
- buffers the data (waits till the process closes and transfers the data in on chunk)
- maximum data transfer up to Node.js v.12.x was 200kb (by default), but since Node.js v.12x was increased to 1MB (by default)
-main.js (file)
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 (basically returns a message every second for 5 seconds than exits)
var interval;
interval = setInterval(function(){
console.log( 'module data' );
if(interval._idleStart > 5000) clearInterval(interval);
}, 1000);
- the
spawn()
child process returns the messagemodule data
every 1 second for 5 seconds, because the data is 'streamed' - the
exec()
child process returns one message onlymodule data module data module data module data module data
after 5 seconds (when the process is closed) this is because the data is 'buffered'
NOTE that neither the spawn()
nor the exec()
child processes are designed for running node modules, this demo is just for showing the difference, (if you want to run node modules as child processes use the fork()
method instead)
The main difference is the spawn
is more suitable for long-running process with huge output. spawn
streams input/output with child process. exec
buffered output in a small (by default 200K) buffer. Also as I know exec
first spawn subshell, then try to execute your process. To cut long story short use spawn
in case you need a lot of data streamed from child process and exec
if you need such features as shell pipes, redirects or even you need exec more than one program in one time.
Some useful links - DZone Hacksparrow