【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子进程,并且能够与之进行通信。

相关推荐
垣宇15 小时前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
爱吃南瓜的北瓜16 小时前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
翻滚吧键盘16 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js
浪九天17 小时前
node.js的版本管理
node.js
浪九天19 小时前
node.js的常用指令
node.js
浪九天21 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
小纯洁w1 天前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
熬夜不洗澡1 天前
Node.js中不支持require和import两种导入模块的混用
node.js
bubusa~>_<1 天前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
天下皆白_唯我独黑1 天前
npm 安装扩展遇到证书失效解决方案
前端·npm·node.js