2016-11-08 114 views
3

是否可以從電子渲染過程中分離出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控制檯。但這是較小的:)

編輯:在我分析我的任務管理器多一點深入後,我看到,電子產卵多個子進程就像它應該。

回答

2

電子的渲染器進程不是分叉子進程的正確位置,您應該考慮將其移至主進程。

儘管如此,它應該按照您描述的方式工作。如果你能在某個地方提供一個最小范例,我可以仔細研究一下。

+0

你能解釋爲什麼渲染過程不是fork子進程的地方嗎?我也嘗試在主流程中分娩一個孩子。但這是同樣的問題。我會再試一次,很快就會通過一個新的代碼。 – Zantinger

+0

當我意識到我無法從孩子登錄msg後,我再次嘗試了我的第一個代碼,它工作正常。但是我仍然對你的陳述感興趣,你爲什麼認爲渲染過程不適合創建子進程。 – Zantinger

+0

@Zantinger,渲染器進程是您的UI代碼所在的地方,對於許多模塊而言,即使(在客戶端/服務器應用程序中,您將它們放在服務器上)讓它們處於渲染器進程中也是有意義的。多虧Chrome DevTools,調試渲染器進程變得非常簡單。 但是,對於依賴於操作系統的功能(如分叉),將其放入主進程通常是有意義的。在我的應用程序的主流程中通常沒有太多的代碼,但就像我提到的調用依賴於我放在那裏的操作系統,我從來沒有後悔過這種選擇。 –