2012-08-19 30 views
5

node.jsの助けが必要です。 私はデータの配列を持っており、(すべてのCPUコアを使用して)そのデータを持つ関数を複数のスレッドで実行する必要があります。 私はいつも私の言語のためにスレッド数のスレッドプールを作成し、いくつかのタスクをプッシュし、終了するまで待って、より多くのタスクをキューに送ります。 しかし、私はnodejsでそれを行う方法を理解できません。node.jsの複数のスレッドでタスクを実行する

PS:私は最新の0.8ブランチを使用しています。

+1

私はあなたがこれを必要と思う:[クラスタ](http://nodejs.org/api/cluster.html) –

+0

イベントドリブンプログラミングは今私にとって非常に珍しいです..私のタスクで使用する例のいくつかの助けが必要です.. – elgato

+0

Node.jsにはスレッドがないので、従来のUNIXプログラミングの概念(すなわち、フォーク、スポーン、IPC-Inter Process Communication)について考える必要があります。典型的な場合のように独自のペイロードフォーマットなどを定義するのではなく、IPCを素早くNode-likeにするhook.ioというNPMモジュールがあります:https://github.com/hookio/hook.io – d11wtq

答えて

4

Nodejsは単一プロセスで実行するように構築されていますが、spawn他のプロセスでも実行できます。 clusterモジュールは、child_processモジュールのforkメソッドを使用しますが、プロセス間でサーバーの接続を分散し、同じポートを共有するためのものです。

私はあなたがほしいと思うと思うexec。例:

var exec = require('child_process').exec, 
child; 

var array = ["a", "b", "c", "d", "e"]; // your array of data 

var n = array.length; // length 
var done = 0; // jobs done 
var i = n; // iterator 

while(i--) { // reverse while loops are faster 
    (function (argument) { // A closure 
     child = exec('node otherFunction.js '+argument, // Spawn the process, with an item from your array as an argument. 
      function (error, stdout, stderr) { 
      if (error === null) { 
       done += 1; 
       if (done === n) { 
        console.log('Everything is done'); 
       } 
      } 
     }); 
    })(array[i]); 
} 

上記もちろん悪いのコードであり、さらにはテストされていませんが、私はそれが仕事だと思います。あなたがしなければならないのは、otherFunction.jsの配列の項目で呼び出したい関数を呼び出して、引数がprocess.argvにあるということです。

+2

逆ループは高速です - このような巨大なパフォーマンスの向上のためには、取引の可読性は明らかです。 SO –

+2

IMHOでも、読みやすさには影響しません –

+0

スピードが気になる場合はループ内でクロージャを作成しないでください(多くの場合++の代わりに+をループするよりもはるかに多い) http: //jsperf.com/closure-vs-name-function-in-a-loop/2 他: http://jslinterrors.com/dont-make-functions-within-a-loop –

関連する問題