【Node.js】child_process 子进程

devtools/2025/1/24 15:00:59/

部分来自: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去识别完成状态,识别起来较为麻烦。

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

execSync

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

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

execFile

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

示例:

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是无上限的。

示例:

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方法适合大量的计算,或者容易阻塞主进程操作的一些代码。

示例:

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程序:

// main.jsconst { 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

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

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

node main.js

这将输出Python脚本的输出:

Python脚本输出: 10Python脚本退出,退出码 0

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

文章来源:https://blog.csdn.net/XiugongHao/article/details/137961893
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/11390.html

相关文章

如何判断客户需求能不能做出来产品?

在做G端产品的过程中,为了让产品可以符合客户实际需求,我们需要经历客户需求调研的这个环节。那么,需求收集后,我们要从什么维度判断客户的需求是否真的可以产品化呢? 我们做G端产品,新产品的方向几乎100%来自于政策。所以才会有“政策带来产品,产品催生政绩”。 可就算…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点(非鼠标手动点击) 四、jsApi地图事…

基于大模型的Text2SQL微调的实战教程(二)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

C语言结构体介绍

文章目录 前言一、结构的基础知识二、结构的声明三、结构体成员的类型四、结构体变量的定义和初始化1. 结构体变量的定义2. 结构体变量的初始化 五、结构体成员的访问六、结构体传参总结 前言 C语言结构体的基础知识,结构体的声明,结构体成员的类型&…

深度解析 Spring 源码:三级缓存机制探究

文章目录 一、 三级缓存的概述二、 三级缓存的实现原理2.1 创建Bean流程图2.2 getBean()2.3 doGetBean()2.4 createBean()2.5 doCreateBean()2.4 getSingleton() 三、 三级缓存的使用场景与注意事项3.1 在实际开发中如何使用三级缓存3.2 三级缓存可能出现的问题及解决方法 一、…

大模型日报2024-04-23

大模型日报 2024-04-23 大模型资讯 苹果可能即将发布新一代大型语言模型AI项目 摘要: 据报道,苹果公司正在开发一种新的大型语言模型,这是一种先进的人工智能技术。这个项目被视为苹果的下一个重大项目,可能不久后将对外公布。业界对此次大公…

服务器防入侵的方案浅析

随着物联网技术和互联网技术的日益发展,勒索病毒、工控安全、产线作业都面领着极大的威胁。智慧互联正在成为各个行业未来的发展方向,智慧互联包括物联网、万物互联,机器与机器,工业控制体系,信息化,也就是…

Git命令行操作(本地操作)

入口 1、任意目录》鼠标右键》Open Git Bash here 2、桌面快捷方式 本地库初始化 在本地库项目文件夹执行命令:git init 验证是否执行成功 .git目录中存放的是本地库相关的子目录和文件,不要删除、修改 设置签名 1、形式 用户名:tom Email地址:GoodMorning@qq.com 2、作…