switch - ¿Cómo puedo ejecutar un módulo node.js como un proceso secundario de un programa node.js?
server on node js (2)
Aquí está mi problema. Implementé un pequeño script que hace un cálculo pesado, como un módulo node.js. Por lo tanto, si escribo "node myModule.js", se calcula por un segundo, luego devuelve un valor Ahora, quiero usar ese módulo de mi programa principal Node.JS. Simplemente podría poner todo el cálculo en una función "doSomeCalculation" y luego hacer:
var myModule = require("./myModule");
myModule.doSomeCalculation();
Pero eso estaría bloqueando, por lo que sería malo. Me gustaría usarlo de forma no bloqueante, como son las llamadas a DB de forma nativa, por ejemplo. Así que traté de usar child_process.spawn y exec, así:
var spawn = require("child_process").spawn;
var ext = spawn("node ./myModule.js", function(err, stdout, stderr) { /* whatevs */ });
ext.on("exit", function() { console.log("calculation over!"); });
Pero, por supuesto, no funciona. Intenté usar un EventEmitter en myModule, emitiendo eventos "computingDone" e intentando agregar el oyente asociado a la variable "ext" en el ejemplo anterior. Todavía no funciona.
En cuanto a las horquillas, no son realmente lo que estoy tratando de hacer. Las bifurcaciones requerirían colocar el código relacionado con el cálculo en el programa principal, bifurcar, calcular en el niño mientras el padre hace lo que hace y luego, ¿cómo devolvería el resultado?
Entonces, aquí está mi pregunta: ¿puedo usar un proceso secundario para hacer algún cálculo sin bloqueo, cuando el cálculo se coloca en un archivo Node, o es simplemente imposible? ¿Debo hacer el cálculo pesado en un script de Python en su lugar? En ambos casos, ¿cómo puedo pasar argumentos al proceso hijo, por ejemplo, una imagen?
Creo que lo que buscas es la API child_process.fork() .
Por ejemplo, si tiene los siguientes dos archivos:
En main.js:
var cp = require(''child_process'');
var child = cp.fork(''./worker'');
child.on(''message'', function(m) {
// Receive results from child process
console.log(''received: '' + m);
});
// Send child process some work
child.send(''Please up-case this string'');
En worker.js:
process.on(''message'', function(m) {
// Do work (in this case just up-case the string
m = m.toUpperCase();
// Pass results back to parent process
process.send(m.toUpperCase(m));
});
Luego, ejecute main (y genere un proceso de trabajo secundario para el código worker.js ...)
$ node --version
v0.8.3
$ node main.js
received: PLEASE UP-CASE THIS STRING
No importa lo que uses como niño (Node, Python, lo que sea), a Node no le importa. Solo asegúrese de que el script de calculcación se cierre después de que todo haya terminado y el resultado se haya escrito en la salida estándar.
La razón por la que no funciona es que estás usando spawn
lugar de exec
.