2010-09-28 20 views
14

Estoy escribiendo un servidor de juegos en node.js, y algunas operaciones implican cálculos intensos en una parte del servidor. No quiero dejar de aceptar conexiones mientras ejecuto esos cálculos: ¿cómo puedo ejecutarlos en segundo plano cuando node.js no admite subprocesos?Cómputos de larga duración en node.js

Respuesta

13

No puedo responder por ninguno de estos, personalmente, pero si está empeñado en hacer el trabajo en proceso, ha habido un par de implementaciones independientes de la API de WebWorkers para el nodo, como se enumera en la página de módulos de nodo:

  • http://github.com/cramforce/node-worker
  • http://github.com/pgriess/node-webworker

A primera vista, la segundo parece más maduro, y ambos te permitirán esencialmente hacer una programación enhebrada, pero básicamente es actor-modelo, así que todo es ne con el envío de mensajes, y no puede haber compartido estructuras de datos ni nada.

Además, por lo que vale la pena, el equipo node.js tiene la intención de implementar precisamente esta API de forma nativa, con el tiempo, por lo que estas herramientas, aunque no sean perfectas, pueden constituir un obstáculo decente.

+2

ryah sugirió node-webworker cuando le hice esta pregunta :) – nornagon

+0

un intento reciente de este problema mencionado en http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html – BigbangO

+0

Otra publicación de blog manejando esto: http : //neilk.net/blog/2013/04/30/why-you-should-use-nodejs-for-CPU-bound-tasks/ – loveNoHate

1

y algunas operaciones implican pesada cálculo por parte del servidor

¿Cómo escribir código que es pesado cómputo en el primer lugar. Eso es muy difícil de hacer en node.js.

cómo puedo ejecutar en segundo plano cuando Node.js no soporta hilos

que podría generar un par de casos de trabajadores (nodo) y comunicarse con la aceptación de conexiones (instancia de nodo) usando por ejemplo redis block pop. La biblioteca redis de Node.js no tiene ningún bloqueo.

+0

No es difícil en absoluto. Estoy recorriendo un mapa de juego que es 128x128x128 = 2 millones de bloques, o cosas más grandes y calculadoras. – nornagon

+0

... o cualquier tipo de procesamiento de imagen. – nornagon

+0

Este enfoque debería funcionar. Debería dividirse y conquistar mediante el envío de mensajes (operaciones de lista de bloqueo). – Alfred

4
var spawn = require('child_process').spawn; 
listorwhatev = spawn('ls', ['-lh', '/usr']);//or whatever server action you need 

//then you can attach events to that list like this 
listorwhatev.on('exit', function(code){}); 

///or in this ls example as it streams info 
listorwhatev.stdout.on('data', function(info){sys.puts(info);}); 

Asegúrese de que el proceso de generación se produce una vez por aplicación, luego alimente con material y mire los eventos por conexión. también debe verificar que el listorwhatev todavía se está ejecutando antes de manejarlo. Como a todos nos encantan esos errores no detectados en el nodo que bloquea la aplicación, no;) Cuando se sale del spawn (pid) aunque se produzca un kill o algo malo en tu máquina y no salgas del spawn en tu código correctamente, su controlador de eventos de transmisión bloqueará su aplicación.

+0

Voy a pasar varios megabytes de datos de ida y vuelta; stdout/stdin realmente no se siente óptimo ... – nornagon

Cuestiones relacionadas