Node.js Spawn与Execute

时间:2018-02-09 03:18:43

标签: javascript node.js function spawn

在一个在线培训视频中,我正在观察学习Node,叙述者说&#34; spawn对于涉及大量数据的较长过程更好,而对于短数据的数据执行更好。&#34; < / p>

这是为什么? Node.js中child_process spawn和execute函数之间有什么区别,我什么时候知道要使用哪一个?

4 个答案:

答案 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()

    创建的
  • 子进程

    • 产生一个外壳,在其中执行传递的命令
    • 缓冲数据(等到进程关闭并按块传输数据)
    • 最大数据传输量200kb(默认情况下)

-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()的顶部实现。