2012-11-14 18 views
45

ここに私の問題があります。私はnode.jsモジュールのように計算量の多い小さなスクリプトを実装しました。したがって、「node myModule.js」と入力すると、1秒間計算されてから値が返されます。 今、メインのNode.JSプログラムからそのモジュールを使いたいと思います。私はちょうどその「doSomeCalculation」機能で、すべての計算をします置くことができます:node.jsプログラムの子プロセスとしてnode.jsモジュールを実行するにはどうすればよいですか?

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

しかし、それはこのように、それは悪いことだ、ブロックされるだろう。私は非ブロック的な方法でそれを使用したいと思います。たとえば、DBコールはネイティブに呼びます。もちろん、それは動作しません、

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!"); }); 

しかし:だから私はこのように、child_process.spawnとexecを使用しようとしました。私はmyModuleのEventEmitterを使用して、 "calculateDone"イベントを出し、上記の例の "ext"変数に関連するリスナーを追加しようとしました。まだ動作しません。

フォークは、実際に私がしようとしているものではありません。フォークは、メインプログラムに計算関連のコードを入れ、フォークし、親が何をしている間に計算し、結果を返すのですか?

これは私の質問です。子プロセスを使用して、ノンブロッキング計算を行うことができますか?計算がノードファイルに置かれているか、それは単なる不可能なのでしょうか?代わりにPythonスクリプトで重い計算を行うべきですか?どちらの場合でも、子プロセスに引数を渡すにはどうすればよいですか?

+7

「午後」ですか?それは朝(またはさらに悪い!)どこかにあるかもしれません:) – elmigranto

答えて

105

私はあなたが後にしているのはchild_process.fork() APIだと思います。例えば

、あなたは次の2つのファイルがある場合:メイン(と産卵を実行するために、次に

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.jsで

:worker.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コードの子ワーカープロセス...)

$ node --version 
v0.8.3 

$ node main.js 
received: PLEASE UP-CASE THIS STRING 
+0

あなたの答えをありがとう!それは今、完璧に動作します。 – user1822364

+11

別の場所から 'main.js'を実行した場合には、' cp.fork(__ dirname + '/ worker'); 'を呼び出す方がよいでしょう。 – CoDEmanX

2

子(Node、Python、どんなもの)として使うかは問題ではありませんが、Nodeは気にしません。の後に計算スクリプトがから終了し、結果がstdoutに書き込まれたことを確認してください。

理由が機能しない理由は、execの代わりにspawnを使用しているという理由があります。

関連する問題