Можно ли развить child_process из процесса рендеринга электронов? Я нашел несколько сообщений по сети, но не было никакой подсказки, как помочь мне заставить мой код работать. Я создал модуль, который обрабатывает дочерние процессы. Этот код работает, когда я запускаю его с помощью 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
};
EDIT: на основе нижеследующего комментария, я развил дочерние процессы в основном процессе. Похоже, что общение с некоторыми исключениями работает. Но первый мой новый код:
// 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, я вижу, что были несколько экземпляров нескольких экземпляров.
Причина, по которой я предпочитаю разветвлять мои дочерние процессы в нескольких экземплярах узлов, заключается в том, что я хочу сделать много манипуляций с изображениями. Поэтому, когда я вилка childs, то каждый ребенок имеет собственный экземпляр узла с памятью и так далее. Я думаю, что это было бы более результативным тогда, когда у меня будет только один экземпляр, который поделился бы памятью и ресурсами со всеми детьми.
Второе неожиданное поведение заключается в том, что оператор console.log в дочернем файле не печатается на моей консоли cmd. Но это меньше:
EDIT: После того, как я проанализировал свой диспетчер задач немного более подробно, я увидел, что электрон порождает несколько дочерних процессов, как это должно быть.
вы можете объяснить, почему процесс визуализации не является местом для разветвления дочернего процесса? Я тоже пытаюсь развить ребенка в основном процессе. Но это была та же проблема. Я попробую еще раз и скоро придет новый код. – Zantinger
После того, как я понял, что я не могу зарегистрировать msg от ребенка, я снова попробовал свой первый код, и он сработал. Но я все еще заинтересован в вашем заявлении, почему вы считаете, что процесс визуализации не подходит для создания дочернего процесса. – Zantinger
@ Zantinger, процесс рендеринга - это место, где живет ваш код пользовательского интерфейса, и для многих модулей имеет смысл позволить им жить в процессе рендеринга, даже если (в клиент-серверном приложении вы поместите их на сервер). Благодаря технологии Chrome DevTools отладка процесса визуализации намного проще. Однако для функциональности, которая зависит от ОС (например, forking), обычно имеет смысл включить ее в основной процесс. Обычно в основных процессах моих приложений обычно не много кода, но, как я уже говорил, звонки, которые зависят от ОС, я там, и я никогда не сожалел об этом выборе. –