3

私は現在、いくつかの計算機能をノンブロッキングで実行するために子プロセスを使用しています。

問題が発生しています。計算の結果を親プロセスの正しいコールバックに結び付ける必要があります。例えば:

var cp = require('child_process');
var n = cp.fork(__dirname + '/child.js');

exports.evaluate = function(data, callback) {

    n.send({ data : data});

    n.once('message', function(result) {

        callback(result);

    }

}

この例の問題は、ある計算が別の計算の前に返されると、正しい結果が得られないことです。

「メッセージ」の代わりにカスタムイベント名を使用して、評価関数が呼び出されるたびに、呼び出されると削除される一意のリスナーを作成する方法はありますか?

子プロセスからカスタム イベントを発行するにはどうすればよいですか?

4

3 に答える 3

7

で新しい EventEmitter を作成しますnew events.EventEmitter。次に、受信したメッセージに基づいてイベントを発行しeventType:"someType"ます。

つまり、次のようなもの

 events = require("events")     
 emitter = new events.EventEmitter
 n.on("message", function(msg) { emitter.emit(msg.eventType,msg.body) })

次に、リスナーを (onceまたはでon) そのイベント エミッターにバインドします。

于 2013-05-12T16:57:10.973 に答える
0

すべての計算が完了するまで、評価関数を再帰的に呼び出すのが良い方法だと思います。計算にキューを使用し、FIFO 方式で処理します。

var computations = [];

n.once('message' を破棄し、evalutate 関数の外側で n.on('message' ハンドラーを定義する必要があります。評価データ型に一致する各 'message' を受け取ります (それを 'result' と呼びましょう)。 . 次に、その結​​果を結果の FIFO キューに保存します. その後、さらに計算があるかどうかを確認し、もう一度評価を呼び出します. これは、評価関数で最も古い計算を切り離すためにクリーンアップできます。したいです。

var results = [];

n.on('message', function(m) {
  if(m.msg === "result") { // message looks like {msg: "result", data: 1234}
    results.push(m.data);
  }
  if(computations.length > 0) {
    var comp = computations[0]; // Save oldest computation
    computations.splice(0,1); // Remove oldest computation from array
    evaluate(comp); // Evaluate oldest computation
  }
  else
    process_results(); // if you have 0 computations left, 
                       // you got the last result so go process them.
});

評価を呼び出す前に、計算をキューにプッシュし、最も古いものを評価に送信する必要があります。

if(computations.length > 0) {
  computations.push(new_comp); // Push on your newest compuation
  var comp = computations[0]; // Save oldest computation
  computations.splice(0,1); // Remove oldest computation from array
  evaluate(comp); // Evaluate oldest computation
}
else {
  evaluate(new_comp); // Evaluate computation
}
evaluate(new_comp); // Evaluate oldest computation

あなたの「DONE」フラグは、computers.length === 0 の場合になります。そして、それは上記のコードで自然に処理されます。n.on('message', handler.. に計算が残っていないときはいつでも、結果処理関数を呼び出すことができます。

結果を処理するには、単純な for ループを使用します。

function process_results() {
    if(results.length > 0)
      for(x in results)
        console.log("New result: "+x);
}
于 2013-05-12T23:14:15.410 に答える