2016-11-08 7 views
3

child_processを電子レンダリングプロセスからフォークすることはできますか?私はネット上のいくつかの投稿を見つけましたが、私のコードをどのように動かすのに役立つのかというヒントはありませんでした。 フォークの子プロセスであるモジュールを作成しました。このコードは、cmdとノードの下で実行したときに動作します。しかし、私の電子アプリでそれを統合しようとすると、私はchild.send()メソッドと通信できません。電子内のchild_process.fork()

// 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:以下のコメントに基づいて、私はメインプロセスで子プロセスをフォークします。 comunicationはほとんど例外なく動作するようです。しかし、最初に私の新しいコード:

// 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); 
    }) 

古い:主な問題は今、私は電子「産卵の新しい子プロセスを考えるとフォークしないこと。 私は自分の仕事マネージャーを見ると、電子からのインスタンスが1つしかないことが分かります。ノードenvでコードを実行すると、複数のノードインスタンスがforkされていることがわかります。

複数のノードインスタンスで子プロセスをフォークする方が好きな理由は、多くのイメージ操作を行いたいということです。だから、私は子供をフォークすると、すべての子は、メモリなどのノードインスタンスを所有しています。すべての子どもたちに記憶とリソースを共有していたインスタンスが1つしかないときは、よりパフォーマンスがよいと思います。

2番目の予期しない動作は、子のconsole.logステートメントがcmdコンソールに出力されないことです。しかし、これは小さいものです:)

EDIT:私は自分のタスクマネージャーをもう少し深く分析した後、私は、その電子が必要とするような複数の子プロセスを生成することを知りました。

答えて

2

電子のレンダラプロセスは子プロセスをフォークするのに適していないので、これをメインプロセスに移すことを考えてください。

しかし、それはあなたが記述する方法で動作するはずです。あなたがどこかで最小限の例を利用できるようにするなら、私はより詳しく見ることができます。

+0

レンダープロセスが子プロセスをフォークする場所ではない理由を説明できますか?私はメインプロセスで子どもをフォークしようとしています。しかしそれは同じ問題でした。私はもう一度それを試み、新しいコードをすぐに過ぎます。 – Zantinger

+0

子からmsgをログに記録できないことがわかった後、最初のコードをもう一度試してみました。しかし、私はまだレンダリングプロセスが子プロセスを作成するための適切な場所ではないと思うというあなたの声明には興味があります。 – Zantinger

+0

@ Zantingerでは、レンダラープロセスはUIコードが存在する場所であり、多くのモジュールでは、(クライアント/サーバーアプリケーションでサーバーに配置しても)レンダラープロセスでそれらを使用できるようになります。レンダラプロセスのデバッグは、Chrome DevToolsのおかげで非常に簡単です。 しかし、OSに依存する機能(フォークのような)では、通常、メインプロセスに入れるのが理にかなっています。私のアプリケーションの主なプロセスには通常はあまりコードはありませんが、そこに置かれているOSに依存する呼び出しについて言及しましたが、私は決してこの選択肢を後悔しませんでした。 –

関連する問題