現在、ブロックしているモジュールで操作を行っているので、これを子プロセスにして、代わりにフォークすることを検討しています。
それをしたいのなら、もちろんモジュールのアーキテクチャを変更する必要があります。モジュールでは、次のように、モジュールを関数として呼び出し、依存関係を渡すことにより、依存関係を挿入する必要があります。
var dependency = { name: "Bob" }
require('worker')(dependency)
次に、私のworker
モジュールで:
module.exports = function (dependency) {
// Outputs { name: "Bob" }
console.log(dependency)
}
この例をフォークされている子プロセスに変換するにはどうすればよいですか?
.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.
}
});
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
メインモジュール:
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();
});