child_process
来源:Node.js
子进程
child_process子进程是Nodejs的核心API,可以用于编写前端工程化工具、处理CPU密集型应用等
1 | const cp = require("child_process") |
Nodejs共有7个可创建子进程的API,Sync表示同步API,没有Sync表示异步API
exec
:执行命令execSync
:同步执行命令execFile
:执行可执行文件execFileSync
:同步执行可执行文件spawn
:执行命令spawnSync
:同步执行命令fork
:创建node子进程
使用
获取Nodejs版本号:
1 | // 参数1:命令名 参数2:配置项(可选) 参数3:回调函数(失败信息、标准输出流、失败输出流) |
options配置项:
1 | { |
execSync
如果只需要执行单次较少的shell命令,需要尽快使用结果,使用同步的execSync会更方便一点
基本用法与exec相同
1 | const nodeVersion = cp.execSync('node -v') |
使用exec可以打开一些软件,使用铬打开百度并进入无痕模式:
1 | cp.execSync("start chrome http://www.baidu.com --incognito") |
execFile
适合执行可执行文件,例如node脚本、shell文件、windows的cmd脚本、posix的sh脚本
例如yajue.cmd这样的脚本
1 | echo '开始' |
使用execFile执行脚本文件
1 | cp.execFile(path.resolve(process.cwd(),'./yajue.cmd'),null,(err,stdout)=>{ |
spawn
exec会返回一个完整的buffer,其字节上限为200k,超出这个大小就会报错;而spawn是无上限的,且因spawn返回的是流,能够边执行边返回,所以可以用于执行一些实时获取的信息
exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦;spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行
1 | // 命令 参数 options配置 |
exec底层通过execFile实现、execFile底层通过spawn实现
一般不会用到spawnSync方法
fork
当需要进行大量计算、或有一些容易阻塞主进程操作的代码,就适合使用fork
它能创建并返回子进程,将耗时任务交给子进程,就能保证主进程通畅了
index.js:
1 | const {fork} = require('child_process') |
test.js:
1 | process.send('我是子进程') |
通过send发送消息、message接收消息,可以相互发送接收
fork底层使用IPC通道进行通讯
评论