2012-01-22 18 views
5

Sto scrivendo un server, e ho deciso di suddividere il lavoro tra diversi processi su node.js, perché ho sentito che node.js era a thread singolo e ho calcolato che sarebbe stato meglio parallelizzare. L'applicazione sarà un gioco. Ho un processo che serve pagine html e quindi altri processi che si occupano della comunicazione tra i clienti che giocano. I client verranno posizionati in "stanze" e quindi utilizzeranno le prese per parlare tra loro trasmesse attraverso il server. Il problema che ho è che il server html deve essere consapevole di quanto siano piene le diverse stanze per posizionare correttamente le persone. I server socket devono aggiornare queste informazioni in modo da mantenere una rappresentazione accurata delle varie stanze. Quindi, per quanto vedo, il server html e i server locali devono condividere alcuni oggetti in memoria. Sto progettando di eseguirlo su una macchina (multicore). Qualcuno sa di un modo semplice per farlo? Qualsiasi aiuto sarebbe molto apprezzatocomunicazione tra due processi in esecuzione node.js

+0

Prova questo, forse funziona per te: [Fibre e fili in node.js - per cosa?] (Http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads -in-node-js-what-for /) Suppongo che ci siano stati sviluppi da quando hai postato. – inf3rno

risposta

0

Sembra che tu non voglia farlo.

Il servizio e il passaggio dei messaggi sono entrambi vincolati all'IO, il quale è molto utile per un singolo thread. Se hai bisogno di calcoli a lungo termine su quei messaggi, quelli potrebbero essere utili per fare separatamente, ma anche così, potresti essere sorpreso di quanto bene fai con un singolo thread.

In caso contrario, guarda in Lavoratori.

2

Il nodo attualmente non supporta direttamente la memoria condivisa, e questo è un riflesso della completa mancanza di semantica di JavaScript o del supporto per il threading/gestione della memoria condivisa.

Con il nodo 0.7, utilizzabile solo di recente anche sperimentalmente, la possibilità di eseguire più loop di eventi e contesti JS in un singolo processo è diventata una realtà (utilizzando il concetto V2 di isolates e grandi modifiche a libuv per consentire più loop di eventi per processo). In questo caso è possibile, ma non ancora supportato direttamente o facilmente, avere una sorta di memoria condivisa. Per farlo è necessario utilizzare un Buffer o un ArrayBuffer (entrambi che rappresentano un blocco di memoria al di fuori dell'heap di JavaScript ma accessibile da esso in modo limitato) e quindi un modo per condividere un puntatore alla rappresentazione V8 sottostante di l'oggetto straniero. So che può essere fatto da un modulo nodo nativo minimo, ma non sono sicuro che sia ancora possibile da solo JS.

Indipendentemente da ciò, lo scenario che hai descritto è meglio soddisfatto semplicemente usando child_process.fork e inviando la quantità (apparentemente minima) di dati attraverso il canale di comunicazione fornito (utilizza la serializzazione).

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

Edit: sarebbe possibile da JS solo supponendo che venga utilizzato nodo ffi per colmare il gap.

1

Si consiglia di provare a utilizzare un database come Redis per questo. Puoi avere un processo sottoscritto da un canale che ascolta nuove connessioni e pubblica dal server web ogni volta che ti serve. È inoltre possibile avere più processi in attesa per gli utenti e utilizzare un elenco e BRPOP per iscriversi per attendere i giocatori.

Problemi correlati