2012-08-19 13 views
5

Ho bisogno di aiuto con node.js dato che sono un principiante. Ho una matrice di dati e devo eseguire le funzioni con quei dati in più thread (usando tutti i core della CPU). In genere per me lingue creo threadpool con numero di thread, spingo alcune attività ad esso, aspetto fino alla fine, invio più attività alla coda. Ma non riesco a capire come farlo in nodejs.Esegui attività in più thread su node.js

PS: sto usando l'ultimo ramo 0.8.

+1

Penso che sia necessario: [cluster] (http://nodejs.org/api/cluster.html) –

+0

programmazione guidata dagli eventi è abbastanza insolito per me ora .. Ho bisogno di aiuto con esempi di utilizzo con il mio compito .. – elgato

+0

Poiché Node.js non ha thread, è necessario pensare di più in termini di concetti di programmazione UNIX tradizionali (ad es. Forking, spawning e IPC-Inter Process Communication). C'è un modulo NPM chiamato hook.io che rende l'IPC carino e simile a Node, piuttosto che definire il proprio formato di payload, ecc., Come in genere dovrebbe essere il caso: https://github.com/hookio/hook.io – d11wtq

risposta

4

Nodejs è progettato per essere eseguito su un singolo processo, ma è possibile eseguire spawn altri processi. Il modulo cluster utilizza il metodo fork dal modulo child_process, ma è concepito per distribuire le connessioni di un server tra processi e condividere la stessa porta.

Penso che tu voglia exec. Esempio:

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]); 
} 

Quanto sopra è ovviamente codice errato e nemmeno testato, ma penso che funzionerebbe. Tutto quello che devi fare è chiamare la funzione che desideri chiamare sugli elementi dell'array in otherFunction.js, all'interno del quale troverai gli argomenti in process.argv.

+2

// Inversione mentre i loop sono più veloci - Sicuramente vale la leggibilità del trading per guadagni così enormi. Solo su SO –

+2

IMHO non ha alcun impatto sulla leggibilità –

+0

se ti interessa la velocità, non creare una chiusura all'interno di un loop che ti fa perdere molto (molto più del ciclo con ++ anziché -) http: //jsperf.com/closure-vs-name-function-in-a-loop/2 anche: http://jslinterrors.com/dont-make-functions-within-a-loop –