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