La garbage collection di Python mi ha reso difficile

2

Contesto: Sto sviluppando un'applicazione web utilizzando webapp2 web-framework con python da ospitare su GAE. L'applicazione web ( web-app d'ora in poi) è una variante degli scacchi. Essendo un primo timer, ho sicuramente fatto un sacco di errori di progettazione. Uno di questi è quello a cui si riferisce questa domanda, ci arriverò tra poco.

Lo scopo della web-app era di consentire a un numero piuttosto elevato di giocatori di giocare a scacchi a 2 giocatori, in modo che più giochi fossero eseguiti in parallelo. Pur non superando la quota gratuita su GAE. ( I am a student ).

Per farlo, ho pensato di creare un nuovo oggetto di gioco e di memorizzare il id(game_object) insieme al machine_id dei due giocatori che giocavano su quell'istanza, nel datastore.

Quando interrogando il datastore con machine_id di un giocatore, potrei ottenere un valore id() , e pensavo potessi usare quel valore come key in un dizionario in cui un riferimento al game_object costituisce il valore.

Facendo questo, non ho bisogno che scriva / aggiorni il datastore, risparmiando così sulle preziose scritture. Potrei facilmente modificare lo stato di gioco di game_object , e potrebbe essere ancora referenziato da id() .

Ma ora quello che succede è che funziona bene per alcune mosse. Successivamente viene eseguita la garbage collection e il game_object viene cancellato dalla memoria. Sollevare un'eccezione NameError.

La mia domanda è, può essere risolto creando nuovi oggetti di gioco in un modulo separato in cui la garbage collection è disattivata e quindi periodicamente / innescata da un evento che libera la memoria? Altrimenti? Come posso risolvere questo problema?

    
posta tMJ 09.12.2013 - 21:30
fonte

1 risposta

3

Non stai eseguendo il processo di garbage collection di Python qui. Google App Engine non garantisce che tutte le richieste vadano nella stessa istanza. Le nuove istanze non condividono la memoria con le vecchie istanze.

Carica nuovamente i tuoi dati nella memoria quando il dizionario è vuoto.

Tutto ciò che fa il garbage collector CPython è interrompere i riferimenti circolari in modo che il normale meccanismo di conteggio dei riferimenti possa rimuovere oggetti dalla memoria quando non vengono più utilizzati. Il tuo processo ha un dizionario che si riferisce ai tuoi dati e il garbage collector non mai toccherà quei dati.

    
risposta data 09.12.2013 - 21:41
fonte