学习笔记 - nodejs child_process
概述
child_process模块提供了创建子进程的能力。
cluster模块基于process进行封装,也提供了用于创建子进程的能力,用于满足多进程部署的需求,使用child_process也可以完成相同的工作。
(cluster模块https://juejin.cn/post/7238785821720412216)
api
child_process.exec(command[, options][, callback])
创建一个子进程,执行一段命令。
const { exec } = require('child_process');
// 创建一个进程,执行index.js
exec('node ./index.js"', () =. {});
child_process.execFile(file[, args][, options][, callback])
指定一个可执行文件,创建一个新的子进程。
const { execFile } = require('child_process');
// 创建一个进程,执行index.js
execFile('a.exe', () =. {});
child_process.spawn(command[, args][, options])
创建一个新的子进程。
const { spawn } = require('node: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(`child process exited with code ${code}`);
});
child_process.fork(modulePath[, args][, options])
const subprocess = child_process.fork('app.js', [`port=${3000 + i}`]);
subprocess.send('message');
child_process.fork() 方法是 child_process.spawn() 的特例,它的特点是创建出的子进程与父进程已经建立了ipc通道, 可以直接使用send方法发送消息。
使用child_process实现多进程服务
// 要拉起的实例数
const num = 5;
const init = async () => {
for (let i = 0; i < num; i++) {
const forked = child_process.fork('app.js', [`port=${3000 + i}`]);
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
console.log('fork process ', forked.pid)
}
}