2012-05-30 6 views
5

GET paramsをデコードし、エンコードされた形式でデータを返すWebサーバーにnodejsを使用しています。デコード/エンコードはノードjの暗号モジュールを使用して行われます。これは同期しているようです。単一の要求を処理するのに十分な時間がかかりますが、イベントループをブロックすると、サービスは並行性が悪くなります。nodejsでCPUバインドタスクを実装する方法

私の要件は単純です。エンコード/デコード機能をイベントループの外にしてください。

  1. 別個のプロセス(child_processまたはクラスタ)

これは単にこの目的のために別個のプロセスのいずれかであり得るが、エンコード/デコードは、子プロセスで遮断されるので、これは、子プロセスを停止します新しいメッセージを受け取るためには、2つの文字列がエンコードされたときに子プロセスがシングルスレッドになるため、状況が発生することはありません。

  1. 各要求(スレッド-午後またはファイバまたはノードwebworker)

ための別のスレッドエンコード/デコード動作を実行する要求ごとに個別のスレッドを作成し、しかしのどれモジュールが期待どおりに動作しているように見えます。つまり、threads-a-gogoはnpmでインストールされず、ファイバはrun()、node-webworker not workingに別のスレッドを作成しませんでした。

誰かが同様の問題に直面しているのか、簡単なメッセージの受け渡しでnodejsにスレッドを簡単に作成する方法がありますか。

+0

:クラスタと

http://nodejs.org/api/cluster.html#cluster_cluster_fork_env

が、それは次のように動作しますあなたのブロッキング/アクティブ待機を受動的なイベント駆動スタイルに変えるために – ControlAltDel

+0

私はCPUに束縛されたタスクとノードは適切ではないと思います。そうすれば、例えばJavaを使用してnode/javaが効果的に通信できるようになります。 – Alfred

+0

私はnodejsのCPUバウンドタスクがひどいことを理解しています。したがって、組み込みの暗号モジュールがそれを個別に処理することが期待されます。しかし、Java/Cのリレー以外のオプションはありませんか? – mdprasadeng

答えて

1

これは、ノードの子プロセスに組み込まれています。ここでのドキュメント:また、クラスタ使用することができ

http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle

:答えは#あなたが必要とする1である

if (cluster.isMaster) { 
    var worker = cluster.fork(); 
    worker.send('encodeThisString'); 

} else if (cluster.isWorker) { 
    process.on('message', function(msg) { 
    var encrypted = crypto.doSomeEncryption(msg); 
    process.send(encrypted); 
    }); 
} 
関連する問題