是否可以從電子渲染過程中分離出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,調試渲染器進程變得非常簡單。 但是,對於依賴於操作系統的功能(如分叉),將其放入主進程通常是有意義的。在我的應用程序的主流程中通常沒有太多的代碼,但就像我提到的調用依賴於我放在那裏的操作系統,我從來沒有後悔過這種選擇。 –