是否可以从电子渲染过程中分离出child_process?我在网上发现了一些帖子,但没有提示如何帮助我获得我的代码工作。 我创建了一个模块,即fork子进程。这段代码有效,当我用cmd和节点运行这个。但是当我尝试将它集成到我的电子应用程序中时,我无法与child.send()方法进行通信。child_process.fork()in Electron
// create fork
const fork = require('child_process').fork;
const fs = require('fs');
const img_path = [
'path/to/an/image1.jpg',
'path/to/an/image2.jpg',
'path/to/an/image3.jpg'
];
const cp = [];
const temp_path = img_path.map((item) => item);
createAndResize(2);
function createAndResize(num) {
return childResize(createChildProcess(num));
}
function createChildProcess(num) {
if(num <= 0) {
return cp;
} else {
let cf = fork('./child.js');
cp.push(cf);
num -= 1;
return createChildProcess(num);
}
}
function childResize(list) {
if(list.length <=0) {
return true;
} else {
// child_process is created
let child = list.shift();
child.on('message', function (data) {
if (!temp_path.length) {
process.kill(data);
} else {
child.send(temp_path.shift());
}
});
child.send(temp_path.shift());
setTimeout(function() {
childResize(list);
}, 1000);
}
}
//child.js
process.on('message', function(msg) {
console.log(msg); //this is never reached
};
编辑:基于下面的注释,我在主流程上fork子流程。除了少数例外,通信似乎都起作用。但首先我的新代码:
// myView.js
const { remote } = require('electron');
const mainProcess = remote.require('./main.js');
const { forkChildfromMain } = mainProcess;
forkChildfromMain();
// main.js
const fork = require('child_process').fork;
let cp = [];
function forkChildfromMain() {
createAndResize(4);
}
function createAndResize(num) {
return childResize(createChildProcess(num));
}
function createChildProcess(num) {
if(num <= 0) {
return cp;
} else {
let cf = fork('./resize.js');
cp.push(cf);
num -= 1;
return createChildProcess(num);
}
}
function childResize(list) {
if(list.length <=0) {
return true;
} else {
let child = list.shift();
child.on('message', function (msg) {
// logs 'Hello World' to the cmd console
console.log(msg);
});
child.send('Hello World');
setTimeout(function() {
childResize(list);
}, 1000);
}
}
exports.forkChildfromMain = forkChildfromMain;
// child.js
process.on('message', function(msg) {
// this console statement get never loged
// I think, I must integrate an icpModule
console.log(msg);
//process send msg back to main.js
process.send(msg);
})
过时:现在主要的问题是,我认为电子“重生”新的子流程,不分叉。 因为,当我看着我的任务管理器时,我只看到一个来自电子的实例。当我在节点env中运行代码时,我发现有多个fork多节点实例。
我更喜欢在多节点实例中分支我的子进程的原因是,我想要对许多图像进行操作。所以当我分叉孩子时,每个孩子都有自己的节点实例和内存等等。当我只有一个实例向所有孩子分享内存和资源时,我认为这会更有效。
第二个意外的行为是,该子项中的console.log语句未打印到我的cmd控制台。但这是较小的:)
编辑:在我分析我的任务管理器多一点深入后,我看到,电子产卵多个子进程就像它应该。
你能解释为什么渲染过程不是fork子进程的地方吗?我也尝试在主流程中分娩一个孩子。但这是同样的问题。我会再试一次,很快就会通过一个新的代码。 – Zantinger
当我意识到我无法从孩子登录msg后,我再次尝试了我的第一个代码,它工作正常。但是我仍然对你的陈述感兴趣,你为什么认为渲染过程不适合创建子进程。 – Zantinger
@Zantinger,渲染器进程是您的UI代码所在的地方,对于许多模块而言,即使(在客户端/服务器应用程序中,您将它们放在服务器上)让它们处于渲染器进程中也是有意义的。多亏Chrome DevTools,调试渲染器进程变得非常简单。 但是,对于依赖于操作系统的功能(如分叉),将其放入主进程通常是有意义的。在我的应用程序的主流程中通常没有太多的代码,但就像我提到的调用依赖于我放在那里的操作系统,我从来没有后悔过这种选择。 –