Pregunta

Estoy escribiendo un servidor de juegos en Node.js, y algunas operaciones implican un cálculo pesado en parte del servidor. No quiero dejar de aceptar conexiones mientras ejecuto esos cálculos: ¿cómo puedo ejecutarlas en segundo plano cuando Node.js no admite hilos?

¿Fue útil?

Solución

No puedo garantizar ninguno de estos, personalmente, pero si estás empeñado en hacer el trabajo en proceso, ha habido un par de implementaciones independientes de la API de trabajadores web 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, el segundo se ve más maduro, y ambos le permitirían hacer una programación enhebrada, pero es básicamente el modelo de actor, por lo que todo se hace con el paso de mensajes, y no puede tener estructuras de datos compartidas ni nada.

Además, por lo que vale, el equipo Node.js tiene la intención de implementar con precisión esta API de manera nativa, eventualmente, por lo que estas herramientas, incluso si no son perfectas, pueden ser un parada decente.

Otros consejos

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 desove ocurra una vez por aplicación, luego alimente las cosas y vea las eventos por conexión. También debe verificar que el listorwhatev todavía se esté ejecutando antes de manejarlo. Como todos amamos esos errores no capturados en el nodo que bloquean la aplicación, ¿no?) Cuando el engendro (PID) sale a través de una matanza o algo malo sucede en su máquina y no salió del engendro en su código con gracia, su Stream Event Handler bloqueará su aplicación.

y algunas operaciones implican un cálculo pesado en parte del servidor

¿Cómo escribió el código que es el cálculo pesado en primer lugar? Eso es muy difícil de hacer en Node.js.

¿Cómo puedo ejecutarlos en segundo plano cuando node.js no admite hilos?

Puede generar un par de instancias de trabajadores (nodos) y comunicarse con las conexiones de aceptación (instancia de nodo) usando, por ejemplo, redis bloqueando POP. Node.js Redis Biblioteca no es un bloqueo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top