学习node.js 三 child_process 子进程

child_process 子进程

子进程是Nodejs核心API,可以写一些shell命令或者编写前端工程化工具之类的,他也有很大的用处,以及处理CPU密集型应用。

创建子进程

Nodejs创建子进程共有7个API Sync同步API 不加是异步API

1. exec execSync

执行shell命令,开启软件,execSync为同步api,在写法上有很多区别

exec的用法案例:

javascript 复制代码
const child_process = require('child_process');
child_process.exec("node --version", (error, stdout, stderr) => {
    if (error) {
        console.error(`exec error: ${error}`);
        return;
    }
    console.log(`stdout: ${stdout}`);
})

child_process.exec(command, [options], callback)

也可以指定options,为一个对象,对象里面就可以指定要设置的参数

javascript 复制代码
cwd <string> 子进程的当前工作目录。
env <Object> 环境变量键值对。
encoding <string> 默认为 'utf8'。
shell <string> 用于执行命令的 shell。 在 UNIX 上默认为 '/bin/sh',在 Windows 上默认为 process.env.ComSpec。 详见 Shell Requirements 与 Default Windows Shell。
timeout <number> 默认为 0。
maxBuffer <number> stdout 或 stderr 允许的最大字节数。 默认为 200*1024。 如果超过限制,则子进程会被终止。 查看警告: maxBuffer and Unicode。
killSignal <string> | <integer> 默认为 'SIGTERM'。
uid <number> 设置该进程的用户标识。(详见 setuid(2))
gid <number> 设置该进程的组标识。(详见 setgid(2))

execSync的用法案例:

这个方法就没有回调函数,options也同上

javascript 复制代码
const child_process = require('child_process');
let str = child_process.execSync("node --version")
console.log(str.toString())

返回一个buffer 所以我们要toString才能拿到我们需要的

使用exec可以打开一些软件例如 wx 谷歌 qq音乐,浏览器 等 以下会打开百度

execSync("start http://www.baidu.com")

2. execFile execFileSync

execFile 适合执行可执行文件,例如执行一个node脚本,或者shell文件,windows可以编写cmd脚本,posix,可以编写sh脚本

execFileSync 则使用的较少

案例:

调用一个外部程序

javascript 复制代码
const {execSync,execFile} = require("child_process");
execFile("ping",["www.jshaman.com"],function(err,stdout,stderr){
    if(err){
        console.error(err);
    }
    console.log("stdout:",stdout)
    console.log("stderr:",stderr);
});
3. spawn

spawn 和exec的用法相同,可以执行shell命令等,他和exec的区别是:

  1. spawn 用于执行一些实时获取的信息因为spawn返回的是流边执行边返回,exec是返回一个完整的buffer,buffer的大小是200k,如果超出会报错,而spawn是无上限的。

  2. spawn在执行完成后会抛出close事件监听,并返回状态码,通过状态码可以知道子进程是否顺利执行。exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦

用法

spawn("命令",['参数'],{配置项})

返回的数据使用data事件监听,案例:

javascript 复制代码
const {spawn} = require("child_process")

const { stdout } = spawn("netstat",['-a'],{})
stdout.on('data', (data) => {
    console.log(`stdout: ${data}`);
})
stdout.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
})

close事件监听进程是否顺利执行完毕

exec是底层通过execFile实现 execFile底层通过spawn实现

4. fork

场景适合大量的计算,或者容易阻塞主进程操作的一些代码,就适合开发fork

父:

javascript 复制代码
const {fork} = require("child_process")

const testProcess = fork("./index.js")
testProcess.send("我是父进程发的消息")
testProcess.on("message", (msg) => {
    console.log("父进程接受:",msg)
})
setTimeout(() => {
    testProcess.kill()
},100)

子:

javascript 复制代码
process.on("message", (data) => {
    console.log("子进程:",data)
})
process.send("Hello from child process")

send 发送信息 ,message接收消息,可以相互发送接收。

相关推荐
盐焗西兰花2 小时前
鸿蒙学习实战之路-Reader Kit修改翻页方式字体大小及行间距最佳实践
学习·华为·harmonyos
QiZhang | UESTC2 小时前
学习日记day76
学习
久邦科技2 小时前
20个免费电子书下载网站,实现电子书自由(2025持续更新)
学习
Gain_chance2 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
Gain_chance4 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
XH华4 小时前
备战蓝桥杯,第九章:结构体和类
学习·蓝桥杯
Gain_chance5 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
Ziky学习记录6 小时前
从零到实战:React Router 学习与总结
前端·学习·react.js
sensen_kiss6 小时前
INT303 Coursework1 爬取影视网站数据(如何爬虫网站数据)
爬虫·python·学习
red_redemption7 小时前
自由学习记录(116)
学习