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);
});
4条答案
按热度按时间ve7v8dk21#
主要的区别是
spawn
更适合长时间运行的具有巨大输出的进程。这是因为spawn
使用子进程流输入/输出。另一方面,exec
将输出缓冲在一个小缓冲区(默认情况下为1 MB,v11.x之前为200 KB)中。exec
首先生成一个子shell,然后尝试执行您的进程。长话短说,如果你需要从子进程流传输大量数据,使用spawn
,如果你需要shell管道、重定向甚至一次多个程序等功能,使用exec
。一些有用的链接-DZoneHacksparrow
atmip9wb2#
spawn()
创建的子进程exec()
创建的子进程spawn()
子进程每隔1秒返回消息module data
,持续5秒,因为数据是“流式”的exec()
子进程在5秒后(当进程关闭时)只返回一条消息module data module data module data module data module data
这是因为数据被“缓冲”了注意,
spawn()
和exec()
子进程都不是为运行节点模块而设计的,此演示只是为了显示差异(如果您希望将节点模块作为子进程运行,请使用fork()
方法)bihw5rsg3#
一个很好的起点是NodeJS documentation。
对于“spawn”,文档状态为:
child_process.spawn()方法使用给定的命令生成一个新进程,参数中包含命令行参数。如果省略,args默认为空数组。
对于“执行”:
生成一个shell,然后在该shell中执行命令,并缓冲所有生成的输出。传递给exec函数的命令字符串直接由shell处理,特殊字符(根据shell而异)需要相应地处理。
主要的问题似乎是您是否需要处理命令的输出,我想这可能是影响性能的因素(我没有比较)。如果您只关心流程完成,那么'exec'将是您的选择。Spawn使用ondata事件打开stdout和stderr的流,exec只返回一个以stdout和stderr为字符串的缓冲区。
uplii1fm4#
引用官方文档:
为了方便起见,
child_process
模块提供了一些child_process.spawn()
和child_process.spawnSync()
的同步和异步替代方案。这些替代方案中的每一个都在child_process.spawn()
或child_process.spawnSync()
之上实现。