在我的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)是一个父母"还有叉子儿?我们可以在叉子里面叉吗?或者这太过分了?
答案 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.