2つのNode.jsプロセスが実行されていると仮定します:_example1.js
_と_example2.js
_。
_example1.js
_には、結果として_result1
_を返す関数func1(input)
があります。
_example2.js
_内からfunc1(input)
を呼び出し、結果として_result1
_を取得する方法はありますか?
Node.jsについて学んだことから、通信にソケットを使用するソリューションは1つしか見つかりませんでした。ただし、ポートでリッスンする1つのプロセスが必要になるため、これは理想的とは言えません。可能であれば、それを避けたい。
編集:いくつかの質問の後、階層に追加したいと思います_example1.js
_は_example2.js
_の子プロセスではなく、むしろ反対です。また、それが役立つ場合-独自のデータを処理する_example1.js
_が1つだけで、_example2.js
_が独自のデータ+最初のプロセスからのデータを処理することができます。
あなたが説明するユースケースでは、 dnode を考えることができます。これにより、さまざまなプロセスによって呼び出される関数を簡単に公開でき、ネットワークソケット(およびsocket.io)を使用するdnodeによって調整されますブラウザの同じメカニズム)。
別のアプローチは、メッセージキューを使用することです。 さまざまなメッセージキューに対して適切なバインディングが多数あります です。
私の知る限り、最も簡単な方法は child_process.fork() を使用することです。
これは、Nodeプロセスを生成するための
spawn()
機能の特殊なケースです。通常のChildProcessインスタンスにすべてのメソッドがあることに加えて、返されるオブジェクトには通信チャネルが構築されます-in。チャネルはchild.send(message, [sendHandle])
で書き込まれ、メッセージは'message'
子のイベント。
したがって、あなたの例では、example2.jsを使用できます。
var fork = require('child_process').fork;
var example1 = fork(__dirname + '/example1.js');
example1.on('message', function(response) {
console.log(response);
});
example1.send({func: 'input'});
そしてexample1.js:
function func(input) {
process.send('Hello ' + input);
}
process.on('message', function(m) {
func(m);
});
Redisをメッセージバス/ブローカーとして使用します。
https://redis.io/topics/pubsub
また、Redisなどのメッセージブローカーを使用する代わりに、ZeroMQなどのポイントツーポイント/ピアツーピアのソケットメッセージングを使用することもできます。
これはどのように作動しますか?
Redisでは、両方のノードアプリケーションで、pub/subを実行する2つのRedisクライアントがあります。したがって、各node.jsアプリにはパブリッシャーとサブスクライバーのクライアントがあります(はい、Redis pub/subのノードプロセスごとに2つのクライアントが必要です)
ZeroMQを使用すると、IPCチャネルを介して、node.jsプロセス間で直接メッセージを送信できます(おそらくOS自体を除き、ブローカーは関与しません。).
Messenger.js を試してみてください。 IPCを手軽に実行できます。
2つのプロセス間の通信を自分で行う必要はありません。