node如何使用多线程(子进程child_process)

开启一个子进程

在Node.js的child_process模块中,有几种执行外部命令的方法,它们的区别如下:

  1. exec()
    这是最简单的方法,它会直接执行一个Shell命令,执行结果会通过回调函数返回,适用于需要获取执行结果的场景。该方法返回一个子进程对象,可以通过此对象来管理子进程的生命周期。
const { exec } = require('child_process');

exec('echo hello world', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});
  1. spawn()
    这个方法可以启动一个子进程并与其交互,可以向子进程中写入数据,也可以从子进程中读取数据。适用于需要实时交互的场景。
const { spawn } = require('child_process');

const process = spawn('ls', ['-al']);

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

process.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

process.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});
  1. execFile()
    这个方法非常适用于直接执行可执行文件的场景,它不需要通过Shell执行,只需要指定可执行文件的路径、参数、回调函数即可。
const { execFile } = require('child_process');

const exePath = 'C:/Program Files/Notepad++/notepad++.exe';
const args = ['test.txt'];

execFile(exePath, args, (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data.toString());
});
  1. fork()
    这个方法是使用spawn()方法的一种特殊情况,用于在子进程中运行JavaScript文件,并且可以通过IPC机制进行进程间通讯。
// parent.js
const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (message) => {
  console.log(`message from child: ${message}`);
});

child.send('hello from parent');

// child.js
process.on('message', (message) => {
  console.log(`message from parent: ${message}`);
});

process.send('hello from child');

以上是四种常用的子进程执行命令的方法,选择哪一种方法要根据具体业务场景和需求进行选择。

关闭子进程

当你不再需要子进程时,应该将其关闭,以释放资源和避免意外错误。有两种方法可以关闭子进程:process.kill()childProcess.kill()

  1. process.kill():是一种通用的方法,其可以终止任何一个进程,包括子进程和父进程。你可以使用该方法向子进程发送可选的信号,例如SIGTERM 和 SIGKILL,以便正常或强制终止子进程。
const { spawn } = require('child_process');
const child = spawn('node', ['childprocess.js']);
setTimeout(() => {
  console.log(`Sending SIGTERM to child process ${child.pid}...`);
  process.kill(child.pid, 'SIGTERM');
}, 5000);
  1. childProces.kill():childProcess.kill() 是一个更专门的方法,其只用于终止与特定 ChildProcess 对象相关联的进程。你可以使用该方法向子进程发送可选的信号,如 SIGTERM 和 SIGKILL,以便正常或强制终止进程。
const { spawn } = require('child_process');
const child = spawn('node', ['childprocess.js']);

setTimeout(() => {
  console.log(`Sending SIGTERM to child process ${child.pid}...`);
  child.kill('SIGTERM');
}, 5000);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容