2016-11-08 3 views
3

Можно ли развить 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: После того, как я проанализировал свой диспетчер задач немного более подробно, я увидел, что электрон порождает несколько дочерних процессов, как это должно быть.

ответ

2

Процесс рендеринга электронной системы не подходит для обработки дочерних процессов, вы должны подумать о том, чтобы переместить это в основной процесс.

Тем не менее, он должен работать так, как вы описываете. Если бы вы предоставили минимальный пример, я мог бы присмотреться.

+0

вы можете объяснить, почему процесс визуализации не является местом для разветвления дочернего процесса? Я тоже пытаюсь развить ребенка в основном процессе. Но это была та же проблема. Я попробую еще раз и скоро придет новый код. – Zantinger

+0

После того, как я понял, что я не могу зарегистрировать msg от ребенка, я снова попробовал свой первый код, и он сработал. Но я все еще заинтересован в вашем заявлении, почему вы считаете, что процесс визуализации не подходит для создания дочернего процесса. – Zantinger

+0

@ Zantinger, процесс рендеринга - это место, где живет ваш код пользовательского интерфейса, и для многих модулей имеет смысл позволить им жить в процессе рендеринга, даже если (в клиент-серверном приложении вы поместите их на сервер). Благодаря технологии Chrome DevTools отладка процесса визуализации намного проще. Однако для функциональности, которая зависит от ОС (например, forking), обычно имеет смысл включить ее в основной процесс. Обычно в основных процессах моих приложений обычно не много кода, но, как я уже говорил, звонки, которые зависят от ОС, я там, и я никогда не сожалел об этом выборе. –

Смежные вопросы