16

現在、ブロックしているモジュールで操作を行っているので、これを子プロセスにして、代わりにフォークすることを検討しています。

それをしたいのなら、もちろんモジュールのアーキテクチャを変更する必要があります。モジュールでは、次のように、モジュールを関数として呼び出し、依存関係を渡すことによって依存関係を挿入する必要があります。

var dependency = { name: "Bob" }
require('worker')(dependency)

次に、私のworkerモジュールで:

module.exports = function (dependency) {
  // Outputs { name: "Bob" }
  console.log(dependency)
}

この例を、フォークされる子プロセスに変換するにはどうすればよいですか?

4

3 に答える 3

27

.fork() を使用すると、完全に別のプロセスが起動されるため、親プロセスと子プロセスの間で参照を渡すことができません (プロセスが作成された後のメッセージングに限定されます)。

メッセージングを必要としないアプローチは、プロセスを fork するときに (配列で) 引数を渡すことです。単純な文字列/数値に固執する必要があると思いますが(ただし、コードからはこれで十分なようです)。例えば。:

トップレベル:

var name = 'bob'
var args = [name];
var childProcess = require('child_process').fork(__dirname + '/worker', args);

ワーカー プロセスで:

var name = process.argv[2]; //AFIAK elements 0 and 1 are already populated with env info

アップデート

本当にメッセージ ルートに行きたい場合 (既にメッセージを送信する必要がある場合はお勧めしません)、メッセージの種類を次のように区別できます (もっと洗練された方法があるかもしれません)。

トップレベル:

var childProcess = require('child_process').fork(__dirname + '/worker');
childProcess.send({msgtype:'dependencies', content:dependencies});

//Then to send 'normal' message:
childProcess.send({msgtype:'myothermessagetype', content:'some content'}

ワーカー プロセス内:

process.on('message', function(msg){
    if(msg.mtype == 'dependencies') {
       var dependencies = msg.content;
       //Do something with dependencies
    } else if(msg.mtype == 'myothermessagetype') {
       var normalmessage = msg.content;
       //Do something in response to normal message.
    }
});
于 2013-03-12T18:08:36.913 に答える
2

a.js

var fork = require ("child_process").fork;
var child;
var init = false;

var m = module.exports = {};
m.init = function (o){
    if (init) return;
    init = true;
    child = fork (__dirname + "/child");
    child.send ({ init: o });
};
m.print = function (o){
    if (!init) return;
    child.send ({ msg: o });
};
m.uninit = function (){
    if (!init) return;
    child.on ("exit", function (){
        init = false;
    });
    child.kill ();
};

child.js

var dependency;

var print = function (o){
    console.log (o + dependency.name);
};

process.on ("message", function (o){
    if (o.init){
        dependency = o.init;
    }else{
        print (o.msg);
    }
});

b.js

var a = require ("./a");
a.init ({ name: "asd" });
a.print ("hi, ");
setTimeout (function (){
    a.uninit ();
}, 1000);

版画: こんにちは、asd

于 2013-03-12T18:26:39.337 に答える
1

メインモジュールでは:

var dependency = {message: 'hello there'};
var args = [JSON.stringify(dependency)];
var child = require('child_process').fork('worker', args);
child.send('sayhello');
child.send('exit');

子プロセス モジュール (worker.js) では:

var dependency = JSON.parse(process.argv[2]);
process.on('message', function(m){
    if(m == 'sayhello') console.log(dependency.message);
    else if(m == 'exit') process.exit();
});
于 2013-03-12T18:14:35.927 に答える