2012-05-14 10 views
4

ユーザーのご要望によっては、重い計算が必要です(約100msの時間がかかります)。もちろん、ノードのメインイベントループでこれを実行したくないため、他のリクエストが処理されないようにします。Node.jsのメインイベントループからの負荷の重い計算

最も明白ですが、この問題を解決する最もクリーンな方法は、計算を別のプログラムにオフロードし、結果を非同期的に待つことです。

ノードプロセスを離れずにプロセス間通信を実装する方法はありますか。例えば。このような何か:

var compute = function (input) { 
    var i, 
     result = input; 
    for (i = 0; i < 1000000; i++) { 
     result = md5(result); 
    } 
} 

var controller = function (req, res) { 
    offload(compute, req.params.input, function(result) { 
     res.send(result); 
    }); 
} 
+1

http://github.com/xk/node-threads-a-gogoは、スレッドアゴゴが* nix上でのみ利用可能であることを除いて、私が探しているようですWindowsで同じことをする方法)。 – penartur

+1

http://nodejs.org/api/child_process.htmlを使用しますか?私はまだすべての解決策がする必要があると思うIPCを行うと信じている – Alfred

+0

はい、私は 'child_process'を知っています - 基本的にそれは外部プロセスをインスタンス化するための唯一の方法なので、あなたのメッセージの中で "まだ"です。私はIPCを実装せずに別のプログラムを書くこともしたいと思います(特に、計算結果が部分的にキャッシュされる可能性があることを考慮して)。基本的には、IPCを正しく実行する唯一の方法は、多数のワーカー(コア数以上)を使用して別のノードクラスタを実行し、IPC-over-httpを実行することです。 – penartur

答えて

3

私はcompute-clusterモジュールを見つけました。私の目標に合わせて設計されているようです。子プロセスを生成し、通信はIPC(無駄なソケットなし)で行われます。

+1

十分に便利なライブラリを使って子プロセスとIPCを使用しても問題ないことを反映するために質問を更新することを検討してください。 – maerics

+0

これにはまだ質問がありませんか? – penartur

+0

質問タイトルは「スレッド」について質問し、本文は「ノードプロセスから離れることなくそれを行う方法はありますか?」と具体的に質問します。したがって、この議論では、個別のプロセスとIPCは考慮されないと人々に信じさせるかもしれません。おそらくタイトルを「ノードイベントループからの重い計算のオフロード」またはそれに類するものに変更するのでしょうか? – maerics

1

JavaScript言語は、スレッドとのNode.jsをサポートしていませんので、あなたがスレッド機能を提供するライブラリに依存する必要がありますどちらか彼らに何のインターフェイスを提供しません。可能な解決策については、node-fibersおよびnode-threads-a-go-goライブラリを参照してください。

node.jsでIPCを少し楽にする方法をお探しの場合は、zeromq librarynode.js bindings)の使用を検討してください。 This somewhat-related-answerも同様に有用かもしれません。

+0

残念ながら、node-threads-a-go-goはWindowsではサポートされていません。分離株は仕事をしているようだが、v0.8でもそこには存在しないだろう。私はzeromqに試してもらいますが、IPCをかなり容易にするようには思われません。 – penartur

関連する問題