Node.js Spawn与执行

83qze16e  于 2023-05-28  发布在  Node.js
关注(0)|答案(4)|浏览(419)

在我正在观看的学习Node的在线培训视频中,解说员说“spawn更适合涉及大量数据的较长进程,而execute更适合短数据位。
这是为什么呢?* Node.js中的child_process spawn和execute函数有什么区别,我什么时候知道该用哪一个?*

ve7v8dk2

ve7v8dk21#

主要的区别是spawn更适合长时间运行的具有巨大输出的进程。这是因为spawn使用子进程流输入/输出。另一方面,exec将输出缓冲在一个小缓冲区(默认情况下为1 MB,v11.x之前为200 KB)中。exec首先生成一个子shell,然后尝试执行您的进程。长话短说,如果你需要从子进程流传输大量数据,使用spawn,如果你需要shell管道、重定向甚至一次多个程序等功能,使用exec
一些有用的链接-DZoneHacksparrow

atmip9wb

atmip9wb2#

  • spawn()创建的子进程
  • 不生成shell
  • 流式处理子进程返回的数据(数据流是常量)
  • 没有数据传输大小限制
  • exec()创建的子进程
  • 会生成一个shell,在其中执行传递的命令
  • 缓冲数据(等待进程关闭并将数据传输到块中)
  • Node.js v.12.x的最大数据传输是200 kb(默认情况下),但由于Node.js v.12x增加到1 MB(默认情况下)
  • 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()方法)

bihw5rsg

bihw5rsg3#

一个很好的起点是NodeJS documentation
对于“spawn”,文档状态为:
child_process.spawn()方法使用给定的命令生成一个新进程,参数中包含命令行参数。如果省略,args默认为空数组。
对于“执行”:
生成一个shell,然后在该shell中执行命令,并缓冲所有生成的输出。传递给exec函数的命令字符串直接由shell处理,特殊字符(根据shell而异)需要相应地处理。
主要的问题似乎是您是否需要处理命令的输出,我想这可能是影响性能的因素(我没有比较)。如果您只关心流程完成,那么'exec'将是您的选择。Spawn使用ondata事件打开stdout和stderr的流,exec只返回一个以stdout和stderr为字符串的缓冲区。

uplii1fm

uplii1fm4#

引用官方文档:
为了方便起见,child_process模块提供了一些child_process.spawn()child_process.spawnSync()的同步和异步替代方案。这些替代方案中的每一个都在child_process.spawn()child_process.spawnSync()之上实现。

相关问题