Node.js 进程与 child_process
child_process 模块用于衍生子进程,是 Node.js 多进程编程的核心。
核心方法
四种异步方式
| 方法 | 用途 | 返回值 |
|---|---|---|
exec | 执行命令,缓存输出 | ChildProcess |
execFile | 执行可执行文件 | ChildProcess |
spawn | 启动进程,流式输出 | ChildProcess |
fork | 衍生 Node.js 子进程 | ChildProcess |
exec 执行命令
JavaScript
const { exec } = require('child_process');
exec('ls -la', (error, stdout, stderr) => {
if (error) {
console.error(`执行错误: ${error.message}`);
return;
}
console.log(stdout);
});
spawn 流式处理
JavaScript
const { spawn } = require('child_process');
const ls = spawn('ls', ['-la']);
ls.stdout.on('data', (data) => {
console.log(`输出: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`错误: ${data}`);
});
ls.on('close', (code) => {
console.log(`进程退出码: ${code}`);
});
fork 衍生 Node 进程
JavaScript
const { fork } = require('child_process');
const child = fork('./child.js');
child.on('message', (msg) => {
console.log('收到子进程消息:', msg);
});
child.send({ hello: 'world' });
同步方法
JavaScript
const { execSync, spawnSync } = require('child_process');
// 同步执行命令
const output = execSync('ls -la');
console.log(output.toString());
进程间通信
JavaScript
// 父进程
const child = fork('./worker.js');
child.send({ type: 'task', data: 'hello' });
child.on('message', (msg) => {
if (msg.type === 'result') {
console.log('结果:', msg.data);
}
});
// 子进程 worker.js
process.on('message', (msg) => {
if (msg.type === 'task') {
process.send({ type: 'result', data: 'processed' });
}
});
注意事项
exec适合小输出量命令,输出超过 maxBuffer 会截断spawn适合大输出或流式处理场景fork只能用于 Node.js 脚本,自动建立 IPC 通道- 子进程默认继承父进程的环境变量
要点总结
exec/execFile缓存输出,适合简单命令spawn流式输出,适合大数据处理fork专用于 Node.js 子进程,内置 IPC 通信- 同步方法会阻塞主线程,谨慎使用
- 通过
send/on('message')实现进程间通信
📝 发现内容有误?点击此处直接编辑