5月27日 01:12
Node.js 如何开启多进程?进程之间如何通讯?
Node.js 用 child_process 模块创建子进程,用 cluster 模块做多核利用:
child_process:
spawn(command, args):启动一个新进程,返回流(适合长时间运行、大量输出的进程)exec(command, callback):启动 shell 执行命令,缓存输出后回调(适合短命令)fork(modulePath):特殊 spawn,创建 Node.js 子进程,自带 IPC 通道
cluster:基于 fork 封装,能创建多个共享同一端口的 worker 进程(常见于 HTTP 服务利用多核)。
进程通讯:fork 创建的父子进程间有 IPC 通道,用 process.send(msg) 和 process.on('message') 通信。底层实现:libuv 管道(pipe)。
追问
cluster 怎么实现多进程共享端口?
主进程监听端口,将接收到的连接通过 Round-Robin 分发给 worker 进程。worker 不直接监听端口,而是接收主进程分配的连接句柄。Linux 上也可用 SO_REUSEPORT 内核级别的分发。
fork 和 spawn 的区别?
fork 是 spawn 的特殊版——专门 fork Node.js 进程,自动建立 IPC 通道。spawn 启动任何命令,流式处理输出,适合与外部程序交互。
PM2 的 cluster 模式和 fork 模式有什么区别?
- cluster:PM2 用 Node.js cluster 模块,多实例共享端口,自动负载均衡
- fork:PM2 只是用 child_process.fork 启动多个实例,需要不同端口或用 Nginx 做反向代理