Javascript 分叉的子进程是否可以是父进程,也可以分叉新进程?
在我的Electron应用程序的用户界面(UI)中,有一个按钮,单击该按钮可启动另一个脚本。此新子级使用来更新进度上的UI来传递状态消息。这一切都很好 然而,在子进程中,有一个点是并行地做一些工作的时候了(Stage6)。在Stage6中,我使用相同的child_process.fork()方法启动8个worker。调试消息表明这8个worker确实做得很好;我在一个数组中保留了对它们的引用,所有这些看起来都很好 问题是,一旦这8名工人被解雇,我就再也没有收到他们的来信。Stage6从未收到他们使用process.send()发送的消息。好像它们不存在 现在,有趣的部分来了在Electron的外部我创建了一个测试脚本(使用CLI上的节点)以与Stage6完全相同的方式启动这8个Worker,它们工作正常,测试脚本可以听到它们的消息。因此,问题不在于工人,而在于他们是如何成立的Javascript 分叉的子进程是否可以是父进程,也可以分叉新进程?,javascript,node.js,electron,Javascript,Node.js,Electron,在我的Electron应用程序的用户界面(UI)中,有一个按钮,单击该按钮可启动另一个脚本。此新子级使用来更新进度上的UI来传递状态消息。这一切都很好 然而,在子进程中,有一个点是并行地做一些工作的时候了(Stage6)。在Stage6中,我使用相同的child_process.fork()方法启动8个worker。调试消息表明这8个worker确实做得很好;我在一个数组中保留了对它们的引用,所有这些看起来都很好 问题是,一旦这8名工人被解雇,我就再也没有收到他们的来信。Stage6从未收到他们
在Electron中,一个本身被分叉的进程(在我的例子中是从UI分叉的)是否也可以是“父进程”和分叉子进程?我们能用叉子叉吗?还是说这太过分了?是的,子进程也可以是“父”进程,并派生另一个子进程。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.`);
});
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();
});
process.send(`This is 3 starting up, and now shutting down`);
process.exit();
2.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.`);
});
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();
});
process.send(`This is 3 starting up, and now shutting down`);
process.exit();
3.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.`);
});
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();
});
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.
你能给出一些示例代码吗?用于调试目的。一般来说,这应该是可行的。这个示例代码是在直线节点中编写的,但是将其移动到电子环境中并没有什么区别。它在Electron中也能很好地工作,所以我将去掉Electron标签并将其标记为答案。