2012-08-19 21 views
5

Necesito ayuda con node.js ya que soy un novato en ello. Tengo una matriz de datos y tengo que ejecutar funciones con esos datos en múltiples hilos (usando todos los núcleos de CPU). En mi idioma habitual, creo un grupo de subprocesos con varios subprocesos, le agrego algunas tareas, espero hasta que termine y le envío más tareas a la cola. Pero no puedo entender cómo hacerlo en nodejs.Ejecutar tareas en varios subprocesos en node.js

PD: estoy usando la última rama 0.8.

+1

Creo que necesita esto: [cluster] (http://nodejs.org/api/cluster.html) –

+0

programación de eventos es bastante inusual para mí ahora .. Necesito ayuda con ejemplos de uso con mi tarea .. – elgato

+0

Como Node.js no tiene subprocesos, debe pensar más en términos de conceptos de programación tradicionales de UNIX (es decir, bifurcación, desove y comunicación de procesos IPC-Inter). Hay un módulo de NPM llamado hook.io que hace que el IPC sea agradable y similar a un nodo, en lugar de definir su propio formato de carga útil, como suele ser el caso: https://github.com/hookio/hook.io – d11wtq

Respuesta

4

Nodejs está diseñado para ejecutarse en un único proceso, pero puede spawn otros procesos. El módulo cluster utiliza el método fork del módulo child_process, pero está destinado a distribuir conexiones de un servidor a través de procesos y compartir el mismo puerto.

Creo que quieres exec. Ejemplo:

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

Lo anterior es, por supuesto, un código incorrecto y ni siquiera probado, pero creo que funcionaría. Todo lo que tiene que hacer es llamar a la función que desea llamar en los elementos de la matriz en otherFunction.js, dentro de los que encontrará los argumentos en process.argv.

+2

// los bucles reverse while son más rápidos. Definitivamente vale la pena negociar legibilidad para obtener ganancias de rendimiento tan grandes. Sólo en SO –

+2

en mi humilde opinión, ni siquiera afecta la legibilidad –

+0

si te preocupa la velocidad, no crees un cierre dentro de un bucle, te hace perder mucho (mucho más que repetir con ++ en lugar de -) http: //jsperf.com/closure-vs-name-function-in-a-loop/2 también: http://jslinterrors.com/dont-make-functions-within-a-loop –

Cuestiones relacionadas