【问题标题】:Can a child_process which was forked be a parent and fork new processes as well?被分叉的 child_process 是否也可以成为父进程并分叉新进程?
【发布时间】:2017-07-11 11:42:24
【问题描述】:

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

然而,在子进程中,有时需要并行执行某些工作(阶段 6)。在 Stage6 中,我使用相同的 child_process.fork() 方法来启动 8 个工作人员。调试消息表明这 8 个工人确实分叉得很好;我在一个数组中保留了对它们的引用,一切看起来都很好。

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

现在,有趣的部分来了! 在 Electron 之外,我创建了一个测试脚本(在 CLI 上使用 Node)来启动这 8 个工作人员以与 Stage6 完全相同的方式,它们工作得很好,而且测试脚本听到他们的消息。所以问题不在于工人,而在于他们是如何启动的。

在 Electron 中,一个本身被分叉的进程(在我的例子中是来自 UI)是否也可以是“父进程”并分叉子进程?我们可以在叉子里面叉子吗?还是分叉太多了?

【问题讨论】:

  • 你能给出一些示例代码吗?用于调试目的。一般来说,这应该工作。

标签: javascript node.js electron


【解决方案1】:

是的,child_process 也可以是“parent”并派生出另一个 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.

【讨论】:

  • 这个示例代码是直接用 Node 编写的,但是将它移到 Electron 环境中并没有什么不同。它在 Electron 中也可以正常工作,所以我将删除 Electron 标签并将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2016-04-21
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多