📜  Node.js 子进程(1)

📅  最后修改于: 2023-12-03 15:17:57.050000             🧑  作者: Mango

Node.js 子进程

在 Node.js 中,可以使用 child_process 模块创建子进程。Node.js 子进程模块提供了可执行文件,shell 命令和 I/O 流的进程间通信等操作。

创建子进程

使用 Node.js 的子进程模块,我们可以通过以下两种方式创建子进程:

spawn()

spawn() 方法用于启动一个新的子进程来执行一些命令,并且它不会阻塞 Node.js 的事件循环。spawn() 方法返回一个 ChildProcess 实例,通过这个实例我们可以与子进程进行交互。

const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);

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

exec() 方法与 spawn() 方法相似,但是通常用于执行较小的命令。当我们执行一些 I/O 密集的操作时,可能会造成进程挂起,所以我们一般不会使用 exec() 来执行一些长时间运行的命令。

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

exec('ls -lh /usr', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});
子进程事件

与 ChildProcess 类型的实例相关的事件如下:

  • exit: 当子进程退出时触发,可以在回调函数中获取进程退出码和信号信息。
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);

child.on('exit', (code, signal) => {
  console.log(`子进程退出 ${code}`);
});
  • close: 子进程的 stdio 流被关闭时触发。
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);

child.stdout.on('close', () => {
  console.log(`子进程的 stdio 流被关闭`);
});
  • error: 当子进程出错时触发。
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr/bad']);

child.on('error', (err) => {
  console.error(`出现错误: ${err}`);
});
子进程属性和方法

ChildProcess 类型的实例还有一些有用的属性和方法:

  • pid: 子进程的进程 ID。
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);

console.log(`子进程的 PID: ${child.pid}`);
  • kill(): 终止子进程。
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);

setTimeout(() => {
  child.kill();
}, 1000);
  • send(message[, sendHandle][, callback]): 发送消息到子进程。
// main.js
const { fork } = require('child_process');
const child = fork('child.js');

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

child.send('你好');

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

process.send('你好啊');
总结

本文介绍了 Node.js 的子进程模块,包括了创建子进程、子进程事件、子进程属性和方法等方面。希望能对使用 Node.js 进行子进程操作的程序员有所帮助!