Nodejs系列-15-child_process模块

概述

Nodejs天生是单线程单进程的,child_process模块可以用于新建子进程。子进程的运行结果储存在系统缓存之中(最大200KB),等到子进程运行结束以后,主进程再用回调函数读取子进程的运行结果。

exec && execSync

用来执行shell命令

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

参数说明:

- command <string> 要运行的命令,并带上以空格分隔的参数。
- options <Object> 参见官网
- callback <Function> 当进程终止时调用并带上输出。
  error <Error>
  stdout <string> | <Buffer>
  stderr <string> | <Buffer>

例子,我们通过命令行来进行文件夹拷贝

  const child_process = require('child_process');
  child_process.exec('cp -rf static static1', (err, stdout, stderr) => {
    if (err) {
      console.log('error:' + stderr);
    } else {
      console.log('success');
    }
  })

execSync是exec的同步执行版本

execFile

execFile方法直接执行特定的程序,参数作为数组传入,不会被bash解释,因此具有较高的安全性

child_process.execFile(file[, args][, options][, callback])

参数说明:

- file <string> 要运行的可执行文件的名称或路径。
- args <string[]> 字符串参数的列表。
- options <Object> 参见官网
- callback <Function> 当进程终止时调用并带上输出。
  error <Error>
  stdout <string> | <Buffer>
  stderr <string> | <Buffer>

例子:子进程执行本地2.js

const { execFile } = require('child_process');
const child = execFile('node', ['2.js'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});

//2.js 内容
console.log("Hello!")

输出:

Hello!

spawn

spawn方法创建一个子进程来执行特定命令,用法与execFile方法类似,但是没有回调函数,只能通过监听事件,来获取运行结果。它属于异步执行,适用于子进程长时间运行的情况。

  child_process.spawn(command[, args][, options])

参数说明:

- command <string> 要运行的命令。
- args <string[]> 字符串参数的列表。
- options <Object> 参见官网

例子,我们依旧通过子进程执行本地2.js

const child_process = require('child_process');
ls=child_process.spawn('node', ['2.js'])
ls.stdout.on('data',  (data)=> {
  console.log('stdout: ' + data);
});

ls.stderr.on('data', (data)=>{
  console.log('stderr: ' + data);
});

ls.on('close', (code)=>{
  console.log('child process exited with code ' + code);
});

运行结果:

stdout: Hello!

child process exited with code 0

也可通过spawn实现文件夹复制功能(windows下powershell执行有问题)

  const child_process = require('child_process');
  child_process.spawn('cp', ['-rf', 'static', 'static2'])

fork 与 send

fork方法直接创建一个子进程,执行Node脚本。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。

child_process.fork(modulePath[, args][, options])

例子:1.js 与 2.js 进行通信:

const child_process = require('child_process');
const n = child_process.fork('./2.js');
n.on('message', (m)=> {
  console.log('PARENT got message:', m);
});
n.send({ hello: 'world' });

2.js中内容:

process.on('message',(m)=> {
  console.log('CHILD got message:', m);
});
process.send({ foo: 'bar' });

运行结果:

CHILD got message: { hello: 'world' }
PARENT got message: { foo: 'bar' }

参考