52

これが私の問題です。node.js モジュールとして、重い計算を行う小さなスクリプトを実装しました。したがって、「node myModule.js」と入力すると、1 秒間計算してから値が返されます。ここで、メインの Node.JS プログラムからそのモジュールを使用したいと考えています。すべての計算を「doSomeCalculation」関数に入れて、次のようにすることができます。

var myModule = require("./myModule");
myModule.doSomeCalculation();

しかし、それはブロッキングになるので、悪いでしょう。たとえば、ネイティブの DB 呼び出しのように、ブロックしない方法で使用したいと思います。そこで、次のように child_process.spawn と exec を使用しようとしました。

var spawn = require("child_process").spawn;
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ });
ext.on("exit", function() { console.log("calculation over!"); });

しかし、もちろん、うまくいきません。上記の例では、myModule で EventEmitter を使用して「calculationDone」イベントを発行し、関連するリスナーを「ext」変数に追加しようとしました。それでもうまくいきません。

フォークに関しては、私がやろうとしているものではありません。フォークでは、計算関連のコードをメイン プログラムに配置し、フォークし、子で計算し、親が何をしても、結果を返す必要があります。

では、私の質問は次のとおりです。計算が Node ファイルに入れられている場合、子プロセスを使用してノンブロッキング計算を実行できますか?それとも単に不可能ですか? 代わりに、Python スクリプトで重い計算を行う必要がありますか? どちらの場合も、子プロセスに引数を渡すにはどうすればよいですか?たとえば、画像ですか?

4

2 に答える 2

132

あなたが求めているのはchild_process.fork() API だと思います。

たとえば、次の 2 つのファイルがあるとします。

main.js で:

var cp = require('child_process');
var child = cp.fork('./worker');

child.on('message', function(m) {
  // Receive results from child process
  console.log('received: ' + m);
});

// Send child process some work
child.send('Please up-case this string');

worker.js で:

process.on('message', function(m) {
  // Do work  (in this case just up-case the string
  m = m.toUpperCase();

  // Pass results back to parent process
  process.send(m.toUpperCase(m));
});

次に main を実行します (そして worker.js コードの子ワーカー プロセスを生成します ...)

$ node --version
v0.8.3

$ node main.js 
received: PLEASE UP-CASE THIS STRING
于 2012-11-14T00:48:34.327 に答える
4

子として何を使用するか (Node、Python など) は問題ではなく、Node は気にしません。すべてが完了し、結果が に書き込まれた、計算スクリプトが終了することを確認してくださいstdout

動作しない理由は、のspawn代わりに使用しているためですexec

于 2012-11-14T00:49:29.703 に答える