web-dev-qa-db-ja.com

node.jsプログラムの子プロセスとしてnode.jsモジュールを実行するにはどうすればよいですか?

これが私の問題です。 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スクリプト?どちらの場合でも、子プロセスに引数を渡すにはどうすればよいですか?たとえば、画像?

49
user1822364

あなたが求めているのは 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));
});

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

$ node --version
v0.8.3

$ node main.js 
received: PLEASE UP-CASE THIS STRING
128
broofa

子として使用するもの(ノード、Pythonなど)には関係ありません。Nodeは関係ありません。計算スクリプトが終了することを確認してくださいafterすべてが完了し、結果がstdoutに書き込まれます。

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

3