分叉的child_process是否可以作为父进程并分叉新进程?

时间:2017-07-10 09:10:16

标签: javascript node.js electron

在我的Electron应用程序的用户界面(UI)中,有一个按钮,当单击时,使用child_process.fork()来启动另一个脚本。这个新孩子使用process.send()来传达状态消息,以更新进度的UI。 这一切都很棒

然而,在儿童过程中,有时间并行(Stage6)。在Stage6中,我使用相同的child_process.fork()方法来启动8个worker。调试消息表明这8个工作人员确实很好地分叉;我在一个数组中保留了对它们的引用,一切似乎都很好。

问题是,一旦这8名工人分叉,我再也没有收到他们的消息。 Stage6永远不会收到使用process.send()发送的消息。它就像它们不存在一样。

现在,这是有趣的部分! Electron的 OUTSIDE 我创建了一个测试脚本(在CLI上使用Node)以与Stage6完全相同的方式启动这8个工作者 ,它们工作正常并且测试脚本听到他们的消息。因此问题不在于工人,而是它们的推出方式。

在Electron中,一个本身可以分叉的进程(在我的情况下来自UI)是一个父母"还有叉子儿?我们可以在叉子里面叉吗?或者这太过分了?

1 个答案:

答案 0 :(得分:0)

是的,child_process也可以是“父”,并分叉另一个child_process 。 OP的问题必须在其他地方。考虑这三个文件:

<强> 1.js

const cp = require("child_process");
const path = require("path");

console.log(`[f1] 1 has started; now forking 2...`);

let f2 = cp.fork(path.normalize(`${__dirname}\\2`));

f2.on("message", (message) => {
  console.log(`[f2] ${message}`);
});

f2.on("exit", () => {
  console.log(`[f1] f2 just exited, so 1 is too.`);
});

<强> 2.js

const cp = require("child_process");
const path = require("path");

process.send(`This is 2 starting up; now forking 3`);

let f3 = cp.fork(path.normalize(`${__dirname}\\3`));

f3.on("message", (message) => {
  console.log(`[f3] ${message}`);
});

f3.on("exit", () => {
  console.log(`[f2] f3 just exited, so I am too.`);
  process.exit();
});

<强> 3.js

process.send(`This is 3 starting up, and now shutting down`);
process.exit();

运行“node 1.js”会产生以下输出,这证明2.js既可以是1.js的子进程,也可以是3.js的父进程

[f1] 1 has started; now forking 2...
[f2] This is 2 starting up; now forking 3
[f3] This is 3 starting up, and now shutting down
[f2] f3 just exited, so I am too.
[f1] f2 just exited, so 1 is too.