在一个在线培训视频中,我正在观察学习Node,叙述者说&#34; spawn对于涉及大量数据的较长过程更好,而对于短数据的数据执行更好。&#34; < / p>
这是为什么? Node.js中child_process spawn和execute函数之间有什么区别,我什么时候知道要使用哪一个?
答案 0 :(得分:7)
一个好的起点是NodeJS documentation。
对于'spawn'文档状态:
child_process.spawn()方法使用给定命令生成一个新进程,其中args中有命令行参数。如果省略,则args默认为空数组。
对于'exec':
生成shell然后在该shell中执行命令,缓冲任何生成的输出。传递给exec函数的命令字符串由shell直接处理,需要相应处理特殊字符(因shell而异)。
主要的是你是否需要处理命令的输出,我想这可能是影响性能的因素(我没有比较)。如果你只关心过程完成而不是它的输出,那么'spawn'似乎就足够了。
答案 1 :(得分:6)
主要区别在于spawn
更适合具有巨大输出的长时间运行过程。 spawn
使用子进程传输输入/输出。 exec
在一个小的(默认为200K)缓冲区中缓冲输出。另外我知道exec
首先生成子shell,然后尝试执行你的过程。如果你需要像shell管道,重定向这样的功能,甚至你需要在一个程序中执行多个程序,那么如果你需要从子进程和spawn
传输大量数据,那么可以缩短长篇文章的短期使用exec
时间。
一些有用的链接 - DZone Hacksparrow
答案 2 :(得分:2)
spawn()
创建的子进程
exec()
创建的子进程
-main.js(文件)
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(与退出相比,每秒5秒以百分数方式返回一条消息)
var interval;
interval = setInterval(function(){
console.log( 'module data' );
if(interval._idleStart > 5000) clearInterval(interval);
}, 1000);
spawn()
子进程每1秒返回一条消息module data
,持续5秒钟,因为数据是“流式传输的” exec()
子进程在5秒钟后(关闭进程时)仅module data module data module data module data module data
返回一条消息,这是因为数据是“缓冲的” 请注意,spawn()
和exec()
子进程都不是为运行节点模块而设计的,此演示仅用于显示差异,(如果要在子进程使用时运行节点模块,请使用fork()
方法代替)
答案 3 :(得分:0)
官方文档的报价:
为方便起见,
child_process
模块为child_process.spawn()
和child_process.spawnSync()
提供了一些同步和异步替代方案。这些替代方案的每一个都在child_process.spawn()
或child_process.spawnSync()
的顶部实现。