深入理解NodeJS 多进程和集群

2020-06-17 07:02:20易采站长站整理


// 文件:~test/sub_process.js
// 给主进程发送消息
process.send("hello");

// 接收主进程回复的消息
process.on("message", data => {
console.log(data);

// 退出子进程
process.exit();
});

// world

这种方式被称为标准进程通信,通过给 options 的 stdio 数组配置 ipc,只要数组中存在 ipc 即可,一般放在数组开头或结尾,配置 ipc 后子进程通过调用自己的 send 方法发送消息给主进程,主进程中用子进程的 message 事件进行接收,也可以在主进程中接收消息的 message 事件的回调当中,通过子进程的 send 回复消息,并在子进程中用 message 事件进行接收,这样的编程方式比较统一,更贴近于开发者的意愿。

4、退出和杀死子进程

上面代码中子进程在接收到主进程的消息时直接退出,也可以在子进程发送给消息给主进程时,主进程接收到消息直接杀死子进程,代码如下。


// 文件:process.js
const { spawn } = require("spawn");
const path = require("path");

// 创建子进程
let child = spawn("node", ["sub_process.js"], {
cwd: path.join(__dirname, "test"),
stdio: [0, "pipe", "ignore", "ipc"]});

child.on("message", data => {
console.log(data);

// 杀死子进程
process.kill(child.pid);
});

// hello world


// 文件:~test/sub_process.js
// 给主进程发送消息
process.send("hello");

从上面代码我们可以看出,杀死子进程的方法为 process.kill,由于一个主进程可能有多个子进程,所以指定要杀死的子进程需要传入子进程的 pid 属性作为 process.kill 的参数。

{% note warning %}

注意:退出子进程 process.exit 方法是在子进程中操作的,此时 process 代表子进程,杀死子进程 process.kill 是在主进程中操作的,此时 process 代表主进程。

{% endnote %}

5、独立子进程

我们前面说过,child_process 模块创建的子进程是被主进程统一管理的,如果主进程挂了,所有的子进程也会受到影响一起挂掉,但其实使用多进程一方面为了提高处理任务的效率,另一方面也是为了当一个进程挂掉时还有其他进程可以继续工作,不至于整个应用挂掉,这样的例子非常多,比如 Chrome 浏览器的选项卡,比如 VSCode 编辑器运行时都会同时开启多个进程同时处理任务,其实在 spawn 创建子进程时,也可以实现子进程的独立,即子进程不再受主进程的控制和影响。


// 文件:process.js
const { spawn } = require("spawn");
const path = require("path");