【Node.js】child_process 子进程

部分来自:Nodejs 第十五章(child_process) - 掘金 (juejin.cn)

创建子进程

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

  1. spawn 执行命令
  2. exec 执行命令
  3. execFile 执行可执行文件
  4. fork 创建node子进程
  5. execSync 执行命令 同步执行
  6. execFileSync 执行可执行文件 同步执行
  7. spawnSync 执行命令 同步执行

exec

执行命令。exec只能通过返回的buffer去识别完成状态,识别起来较为麻烦。

js 复制代码
child_process.exec(command, [options], callback)
// 获取node 版本号
 exec('node -v',(err,stdout,stderr)=>{
    if(err){
        return  err
    }
    console.log(stdout.toString())
 })

execSync

执行单次 shell ,比如这里我打开 edge 并打开百度。

js 复制代码
execSync("start microsoft-edge:http://www.baidu.com")

execFile

execFile方法用于执行可执行文件,并且在执行完成后将结果传递给回调函数。例如执行一个node脚本,或者shell文件。这个方法适用于需要简单地执行外部命令,并且不需要与子进程进行交互的情况。

示例:

javascript 复制代码
const { execFile } = require('child_process');

execFile('ls', ['-lh', '/usr'], (error, stdout, stderr) => {
  if (error) {
    console.error(`执行出错: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

在这个示例中,ls命令会列出/usr目录的内容,并且将结果输出到标准输出。execFile方法将执行结果传递给回调函数,可以通过stdout获取标准输出的内容,通过stderr获取标准错误输出的内容。

2. spawn

spawn方法用于创建一个新的子进程,并且可以与子进程进行交互,包括向子进程发送输入数据,以及监听子进程的输出。

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

示例:

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

const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`子进程退出,退出码 ${code}`);
});

在这个示例中,spawn方法创建了一个新的子进程来执行ls命令,然后监听子进程的标准输出和标准错误输出。当子进程退出时,将触发close事件。

3. fork

fork方法适合大量的计算,或者容易阻塞主进程操作的一些代码。

示例:

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

const child = fork('child.js');

child.on('message', (message) => {
  console.log(`接收到消息:${message}`);
});

child.send('你好,子进程!');

在这个示例中,fork方法创建了一个新的子进程来执行child.js文件,然后通过send方法向子进程发送消息。子进程可以通过监听message事件来接收消息。

应用实例

假设我们有一个Node.js程序,需要执行一个Python脚本,并且与该Python脚本进行通信,然后将结果返回给Node.js程序。

首先,我们创建一个名为main.js的Node.js程序:

javascript 复制代码
// main.js

const { spawn } = require('child_process');

// 执行Python脚本
const pythonProcess = spawn('python', ['script.py']);

// 监听Python脚本的输出
pythonProcess.stdout.on('data', (data) => {
  console.log(`Python脚本输出: ${data}`);
});

// 监听Python脚本的错误输出
pythonProcess.stderr.on('data', (data) => {
  console.error(`Python脚本错误输出: ${data}`);
});

// 监听Python脚本关闭事件
pythonProcess.on('close', (code) => {
  console.log(`Python脚本退出,退出码 ${code}`);
});

上面的代码中,我们首先引入了child_process模块中的spawn函数,该函数用于创建一个子进程来执行外部命令。然后我们使用spawn函数来执行Python脚本script.py。我们监听了子进程的stdout(标准输出)、stderr(标准错误输出)和close(关闭)事件。

接下来,我们编写一个简单的Python脚本script.py:

bash 复制代码
# script.py

# 将结果输出到标准输出
print(10)

运行main.js,它将启动Python脚本作为子进程,并通过标准输出打印Python脚本的输出。例如:

bash 复制代码
node main.js

这将输出Python脚本的输出:

bash 复制代码
Python脚本输出: 10

Python脚本退出,退出码 0

在这个例子中,我们通过Node.js的child_process模块成功创建了一个Python子进程,并且能够与之进行通信。

相关推荐
濮水大叔7 小时前
Cabloy/Vona 为什么不需要 NestJS 的 Dynamic Module
typescript·node.js·nestjs
匠云创新9 小时前
读完一万段要两分钟:我们把标书读取从 WPS 对象模型搬到了 docx 解析
性能优化·node.js
某哈压力大17 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
回眸&啤酒鸭18 小时前
【回眸】Node.js 新手从零到一实战指南
node.js
浪遏1 天前
recruitment-cli:让 AI 接手求职招聘,从架构到一次发送超时
架构·typescript·node.js
沉默小管2 天前
我用 NestJS + Nuxt 3 做了个导航站,聊几个踩过的坑
node.js·seo
非优秀程序员3 天前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
Hone3 天前
juejin-skills 系列 ②:我把「看掘金热榜」也做成了 Agent 技能
开源·node.js·ai编程
w16634 天前
零 Root 无 PC:我让 AI 在手机上把鸿蒙 HDC 协议的底裤扒了下来
node.js
严肃小白兔5 天前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式