49

問題は次のとおりです。

  • 2つのNode.jsプロセスが実行されていると仮定します:example1.jsexample2.js

  • 結果として戻るexample1.js関数があります。func1(input)result1

  • example2.jsから電話をかけて結果としてfunc1(input)入手する方法はありresult1ますか?

Node.jsについて学んだことから、通信にソケットを使用するソリューションは1つしか見つかりませんでした。ただし、ポートでリッスンする1つのプロセスが必要になるため、これは理想的とは言えません。可能であれば、それを避けたいと思います。


編集:example1.jsいくつかの質問の後、階層内での子プロセスでexample2.jsはなく、その逆であること を追加したいと思います。また、それが役立つ場合は、独自のデータを処理するのは1つだけであり、最初のプロセスからの独自のデータ+データを処理するのはexample1.js多くの場合です。example2.js

4

3 に答える 3

50

あなたが説明するユースケースは、ネットワークソケット(およびsocket.io、ブラウザで同じメカニズムを使用できる)を使用するdnodeによって調整された、さまざまなプロセスによって呼び出される関数を簡単に公開できるdnodeについて考えさせます。 。

別のアプローチは、メッセージキューを使用することです。さまざまなメッセージキューに対して多くの適切なバインディングがあります。

私の知る限り、最も簡単な方法は、child_process.fork()を使用することです。

これは、spawn()ノードプロセスを生成するための機能の特殊なケースです。通常のChildProcessインスタンスにすべてのメソッドがあることに加えて、返されるオブジェクトには通信チャネルが組み込まれています。チャネルはwithに書き込まれ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);
});
于 2012-04-18T16:26:34.660 に答える
6

たぶん、 Messenger.jsを試してみてください。便利な方法でIPCを実行できます。

2つのプロセス間の通信を自分で行う必要はありません。

于 2012-08-23T05:38:49.013 に答える
6

メッセージバス/ブローカーとしてRedisを使用します。

https://redis.io/topics/pubsub

Redisのようなメッセージブローカーを使用する代わりに、ポイントツーポイント/ピアツーピアであるZeroMQのようなソケットメッセージングを使用することもできます。

これはどのように作動しますか?

Redisを使用すると、両方のノードアプリケーションで、pub/subを実行する2つのRedisクライアントがあります。したがって、各node.jsアプリにはパブリッシャークライアントとサブスクライバークライアントがあります(はい、Redis pub / subのノードプロセスごとに2つのクライアントが必要です)

ZeroMQを使用すると、IPCチャネルを介して、node.jsプロセス間で直接メッセージを送信できます(ブローカーは関与しません-おそらくOS自体を除きます)。

于 2015-09-13T02:52:33.113 に答える