• 【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去识别完成状态,识别起来较为麻烦。

    child_process.exec(command, [options], callback)
    // 获取node 版本号
     exec('node -v',(err,stdout,stderr)=>{
        if(err){
            return  err
        }
        console.log(stdout.toString())
     })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    execSync

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

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

    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}`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这个示例中,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}`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这个示例中,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('你好,子进程!');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    应用实例

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

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

    // 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}`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

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

    # script.py
    
    # 将结果输出到标准输出
    print(10)
    
    • 1
    • 2
    • 3
    • 4

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

    node main.js
    
    • 1

    这将输出Python脚本的输出:

    Python脚本输出: 10
    
    Python脚本退出,退出码 0
    
    • 1
    • 2
    • 3

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

  • 相关阅读:
    基于图像的照明(IBL)简明教程
    低代码提速应用开发
    《HTML基础学习》
    VC++几种加载图片方法的讨论(附源码)
    怎么从零开始搭建配置Windows云服务器的新手入门教程
    完全背包问题--找零钱
    旺季来临,老板反而恐慌弃租?真实的市场情况出乎意料!
    Linux下编译main.c文件,命令中的gcc -o -c是什么意思
    java计算机毕业设计猫咪伤患会诊复查医疗平台源码+系统+mysql数据库+lw文档
    基于Windows 的 VS Code C/C++ 编译环境搭建
  • 原文地址:https://blog.csdn.net/XiugongHao/article/details/137961893