Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分叉的子进程是否可以是父进程,也可以分叉新进程?_Javascript_Node.js_Electron - Fatal编程技术网

Javascript 分叉的子进程是否可以是父进程,也可以分叉新进程?

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)中,有一个按钮,单击该按钮可启动另一个脚本。此新子级使用来更新进度上的UI来传递状态消息。这一切都很好

然而,在子进程中,有一个点是并行地做一些工作的时候了(Stage6)。在Stage6中,我使用相同的child_process.fork()方法启动8个worker。调试消息表明这8个worker确实做得很好;我在一个数组中保留了对它们的引用,所有这些看起来都很好

问题是,一旦这8名工人被解雇,我就再也没有收到他们的来信。Stage6从未收到他们使用process.send()发送的消息。好像它们不存在

现在,有趣的部分来了在Electron的外部我创建了一个测试脚本(使用CLI上的节点)以与Stage6完全相同的方式启动这8个Worker,它们工作正常,测试脚本可以听到它们的消息。因此,问题不在于工人,而在于他们是如何成立的


在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标签并将其标记为答案。