2012-01-22 55 views
5

Escribo un servidor y decido dividir el trabajo entre los diferentes procesos que ejecutan node.js, porque escuché que node.js tenía un único hilo y supuse que esto se paralizaría mejor. La aplicación va a ser un juego. Tengo un proceso que sirve páginas html, y luego otros procesos relacionados con la comunicación entre los clientes que juegan el juego. Los clientes se colocarán en "salas" y luego usarán sockets para comunicarse entre ellos a través del servidor. El problema que tengo es que el servidor html debe ser consciente de qué tan completas están las diferentes salas para ubicar a las personas correctamente. Los servidores de socket necesitan actualizar esta información para que se mantenga una representación precisa de las distintas salas. Entonces, hasta donde yo lo veo, el servidor html y los servidores de sala necesitan compartir algunos objetos en la memoria. Estoy planeando ejecutarlo en una máquina (multinúcleo). ¿Alguien sabe de una manera fácil de hacer esto? Cualquier ayuda sería muy apreciadacomunicación entre dos procesos que ejecutan node.js

+0

Pruebe esto, tal vez funcione para usted: [Fibras e hilos en node.js - ¿para qué?] (Http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads -in-node-js-what-for /) Supongo que hubo novedades desde que publicaste. – inf3rno

Respuesta

0

Parece que no quiere hacer eso.

La publicación y el envío de mensajes están vinculados a IO, lo cual es muy bueno haciendo un nodo con un solo hilo. Si necesita cálculos prolongados sobre esos mensajes, podría ser bueno hacerlo por separado, pero aún así, es posible que se sorprenda de lo bien que lo hace con un solo hilo.

De lo contrario, consulte a los trabajadores.

2

El nodo actualmente no es compatible con la memoria compartida directamente, y eso es un reflejo de la completa falta de semántica de JavaScript o la compatibilidad con el manejo de la memoria compartida.

Con nodo de 0,7, sólo recientemente utilizable incluso de forma experimental, la capacidad de ejecutar múltiples bucles de eventos y contextos JS en un solo proceso se ha convertido en una realidad (utilizando el concepto de V8 de isolates y grandes cambios a libuv para permitir que los bucles de eventos múltiples por proceso) En este caso, es posible, pero aún no es compatible directamente o es fácil, tener algún tipo de memoria compartida. Para hacer eso necesitarías usar un Buffer o ArrayBuffer (ambos representan un trozo de memoria fuera del montón de JavaScript pero accesible desde él de forma limitada) y luego una forma de compartir un puntero a la representación V8 subyacente de el objeto extraño Sé que se puede hacer desde un módulo de nodo nativo mínimo, pero no estoy seguro si aún es posible solo de JS.

Independientemente, el escenario que describió se cumple mejor simplemente usando child_process.fork y enviando la cantidad (aparentemente mínima) de datos a través del canal de comunicación provisto (usa la serialización).

http://nodejs.org/docs/latest/api/child_processes.html

Editar: que sería posible a partir de JS solo suponiendo que utilizó nodo-fi para cerrar la brecha.

1

Puede intentar usar una base de datos como Redis para esto. Puede tener un proceso suscrito a un canal escuchando nuevas conexiones y publicación desde el servidor web cada vez que lo necesite. También puede tener múltiples procesos esperando a los usuarios y usar una lista y BRPOP para suscribirse para esperar a los jugadores.

Cuestiones relacionadas