Node.js Child Process 的 spawn/exec/fork 区别
请比较 Node.js 中 child_process 模块的 spawn、exec、execFile、fork 四个方法的区别,以及各自适用的场景。
回答
屠龙少年
1. spawn(command, args):
- 功能:启动新进程,通过 Stream 处理 I/O(stdout/stderr 是可读流)
- 输出:不缓存输出(适合大数据量)
- 场景:运行长时间进程、大量输出(如 ffmpeg、grep 管道)
- 示例:
spawn('ls', ['-lh', '/usr'])
2. exec(command, callback):
- 功能:启动 shell,执行命令,回调获取完整输出
- 输出:在内存中缓存 stdout/stderr(最大 200KB,超出报错)
- 场景:需一次性获取小量结果、需使用 shell 管道(
|、>) - 注意:shell 注入风险(参数需转义)
3. execFile(file, args, callback):
- 功能:直接执行可执行文件(不启动 shell),更高效安全
- 输出:类似 exec,缓存输出
- 场景:执行 .exe/.bin 文件,无需 shell 特性
4. fork(modulePath):
- 功能:生成 Node.js 子进程,内置 IPC 通信
- 通信:
child.send()+process.on('message') - 场景:计算密集型任务隔离(如 JSON 解析、图像处理)
| 方法 | Shell | 输出方式 | 内存限制 | IPC |
|---|---|---|---|---|
| spawn | 否 | Stream | 无 | 否 |
| exec | 是 | 回调缓存 | 200KB | 否 |
| execFile | 否 | 回调缓存 | 200KB | 否 |
| fork | 否 | 回调缓存 | 无 | 是 |