2012-04-01 8 views
15

Per un gioco di programmazione multigiocatore, sto lavorando a un server di compilation in background per Scala che supporta la compilazione di più alberi di sorgenti indipendenti inviati dai giocatori. Sono riuscito a correre veloce, compilations sequenziali senza ricaricare il compilatore istanziando l'oggetto Global compilatore tramiteIl compilatore di Scala è rientranti?

val compilerGlobal = new Global(settings, reporter) 

e quindi eseguire i lavori individuali di compilazione via

val run = new compilerGlobal.Run 
run.compile(sourceFilePathList) 

Vorrei ora ideale per parallelizzare il server (vale a dire eseguire più sessioni di compilazione contemporaneamente), ma senza ricaricare il compilatore (principalmente per evitare di ri-analizzare la lib) da zero ogni volta. È possibile, cioè la seconda parte mostrata sopra (in modo sicuro :-) ri-entrante, o mantiene lo stato globale? Se no, c'è qualcos'altro che posso provare? Attualmente sono concentrato sul supporto di Scala 2.9.1.

+0

Detiene lo 'stato globale' della tabella dei simboli, per cominciare. – EJP

+2

Utilizzare un pool di istanze del compilatore. – retronym

+0

@retronym Grazie per il suggerimento. La mia domanda principale, tuttavia, è "quanto posso riciclare?". Il tuo commento suggerisce che non esiste uno stato globale condiviso tra istanze del compilatore (in memoria) (classe Global), che è un buon inizio. Ma stai anche suggerendo che l'individuo esegua lo stato di condivisione DO (oltre la normale lib standard analizzata)? Avrei bisogno di più informazioni. –

risposta

4

Sì, compilatore Esegue lo stato condiviso, quindi non è necessario condividerli tra i thread. È uno dei problemi che si presentano nel plugin Eclipse. Come notato da @EJP, la tabella dei simboli è condivisa.

Questo non è così importante nel tuo caso, ma arriva in un IDE: il compilatore usa la pigrizia nei tipi, il che significa che possono verificarsi computazioni (e mutazione) aggiuntive quando si chiamano i metodi su Symbol. A causa di problemi di visibilità, è importante che questi metodi vengano chiamati nello stesso thread come quello che li ha creati.

Problemi correlati