学习路线:从当前进程到可靠的多进程服务

适用版本:Node.js 22 及以上。本教程使用 TypeScript 的 import 语法,并按本项目的 tsconfig.json 编译为 CommonJS;示例可保存为 .ts 后用 ts-node 文件名.ts 运行。

本章解决的问题

一张总图

操作系统
└─ 当前 Node.js 进程(process)
   ├─ JavaScript 主线程 + Event Loop
   ├─ libuv 管理的系统 I/O 和线程池
   ├─ 外部工具进程(child_process.spawn)
   └─ Node.js 子进程(child_process.fork)

cluster Primary(也是 Node.js 进程)
├─ Cluster Worker 1(独立 Node.js 进程)
└─ Cluster Worker 2(独立 Node.js 进程)

进程之间默认不共享 JavaScript 变量。可用标准流、Node IPC、Socket、Redis、数据库或消息队列通信。标准流适合父子进程传字节;IPC 适合有关联的 Node.js 进程传结构化消息;跨机器通常应使用外部共享系统。

贯穿项目:分析任务执行服务

教程将逐步设计一个日常常见的服务:HTTP 接口接收任务,Node.js 调用 Bash/Python 工具,保存结果并可优雅停机。

POST /analysis-tasks
        ↓
创建任务记录
        ↓
spawn(command, args) 启动工具
        ↓
stdout:机器可读结果/进度
stderr:诊断日志
        ↓
等待 close,结合退出码判断成功
        ↓
保存结果;超时、取消、停机时清理

建议的外部脚本协议:

stdin       可选输入数据
stdout      JSON Lines 进度和最终结果
stderr      日志、警告和诊断
exit 0      脚本成功
exit 非 0   脚本失败

例如 stdout:

{"type":"progress","percent":40}
{"type":"result","outputPath":"results/task-123.json"}

学习阶段

  1. 00~06:当前进程、参数、标准流、Bash 管道、信号和优雅退出。
  2. 07~13:创建第三方进程,正确处理输出、失败、超时和清理。
  3. 14~15:IPC,以及不同 worker 概念的边界。
  4. 16~18:Cluster、多进程 Express 和重复副作用。
  5. 19~21:命令安全、部署与排错。
  6. 22~23:综合项目和高频 API 速查。

高频 API 预览

process.pid;
process.argv;
process.env;
process.cwd();
process.stdout.write("hello\n");
process.on("SIGTERM", () => {});

// 后续章节会使用:
// spawn(), execFile(), fork(), cluster.fork()

正常与异常时间线

正常 CLI:

读取 argv/env → 执行业务 → 写 stdout → 设置 exitCode=0/自然结束

异常 CLI:

校验失败 → 写 stderr → 设置 exitCode=1 → 让待完成的输出自然收尾

正常服务停机:

收到 SIGTERM → 停接新请求 → 等在途任务 → 关闭资源 → 自然退出

异常做法:

任意位置 process.exit(1) → 尚未写完的日志、响应或文件可能被截断

Windows 与 Linux

常见认识误区

最佳实践

练习题

  1. 用自己的话解释 processchild_processcluster 的职责。
  2. 设计一个图片转换脚本的 stdin、stdout、stderr 和退出码协议。
  3. 思考:为什么不能把内存中的 Map 当作 Cluster 下的共享任务表?

验收点