2016-11-08 61 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,调试渲染器进程变得非常简单。 但是,对于依赖于操作系统的功能(如分叉),将其放入主进程通常是有意义的。在我的应用程序的主流程中通常没有太多的代码,但就像我提到的调用依赖于我放在那里的操作系统,我从来没有后悔过这种选择。 –