// 创建子进程
let child = spawn("node", ["sub_process.js"], {
cwd: path.join(__dirname, "test"),
stdio: "ignore",
detached: true
});
// 与主进程断绝关系
child.unref();
// 文件:~test/sub_process.js
const fs = require("fs");setInterval(() => {
fs.appendFileSync("test.txt", "hello");
});
要想创建的子进程独立,需要在创建子进程时配置 detached 参数为 true,表示该子进程不受控制,还需调用子进程的 unref 方法与主进程断绝关系,但是仅仅这样子进程可能还是会受主进程的影响,要想子进程完全独立需要保证子进程一定不能和主进程共用标准输入、标准输出和错误输出,也就是 stdio 必须设置为 ignore,这也就代表着独立的子进程是不能和主进程进行标准进程通信,即不能设置 ipc。
fork 实现多进程
1、fork 的使用
fork 也是 child_process 模块的一个方法,与 spawn 类似,是在 spawn 的基础上又做了一层封装,我们看一个 fork 使用的例子。
// 文件:process.js
const fork = require("child_process");
const path = require("path");// 创建子进程
let child = fork("sub_process.js", ["--port", "3000"], {
cwd: path.join(__dirname, "test"),
silent: true
});
child.send("hello world");
// 文件:~test/sub_process.js
// 接收主进程发来的消息
process.on("message", data => console.log(data));fork 的用法与 spawn 相比有所改变,第一个参数是子进程执行文件的名称,第二个参数为数组,存储执行时的参数和值,第三个参数为 options,其中使用 slilent 属性替代了 spawn 的 stdio,当 silent 为 true 时,此时主进程与子进程的所有非标准通信的操作都不会生效,包括标准输入、标准输出和错误输出,当设为 false 时可正常输出,返回值依然为一个子进程。
fork 创建的子进程可以直接通过 send 方法和监听 message 事件与主进程进行通信。
2、fork 的原理
其实 fork 的原理非常简单,只是在子进程模块 child_process 上挂了一个 fork 方法,而在该方法内调用 spawn 并将 spawn 返回的子进程作为返回值返回,下面进行简易实现。
// 文件:fork.js
const childProcess = require("child_process");
const path = require("path");// 封装原理
childProcess.fork = function (modulePath, args, options) {
let stdio = options.silent ? ["ignore", "ignore", "ignore", "ipc"] : [0, 1, 2, "ipc"];
return childProcess.spawn("node", [modulePath, ...args], {
...options,









