是否可以从 Electron 渲染过程中派生出child_process?我在网上找到了一些帖子,但是没有任何提示可以帮助我使代码正常工作。
我创建了一个模块,用于 fork 子进程。当我使用cmd在 Node 下运行此代码时,此代码有效。但是,当我尝试将其集成到 Electron 应用程序中时,无法与child.send()方法进行通信。
// 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
};
编辑:基于以下评论,我在主进程上创建了子进程。交流似乎很少异常(exception)。但是首先我的新代码:
// 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);
})
过时的:现在的主要问题是,我认为 Electron 会“产生”新的子进程,并且不会 fork 。
因为,当我看我的任务管理器时,我只看到一个 Electron 实例。当我在 Node env中运行代码时,我看到有fork多个 Node 实例。
我之所以喜欢在多个 Node 实例中 fork 子进程,是因为我要进行许多图像处理。因此,当我 fork child 时,每个 child 都有自己的带有内存的 Node 实例,依此类推。我认为,当我只有一个实例将内存和资源共享给所有 child 时,这将使性能更高。
第二个意外行为是,子级中的console.log语句未打印到我的cmd控制台。但这是较小的:)
编辑:在我对任务管理器进行了更深入的分析之后,我发现, Electron 会像应有的那样产生多个子进程。
最佳答案
Electron的渲染器进程不是 fork 子进程的正确位置,您应该考虑将其移至主进程。
但是,它应该按照您描述的方式工作。如果您想在某个地方提供一个最小的示例,我可以仔细看看。