3.2 gc -- L'interfaccia Garbage Collector

Il modulo gc è disponibile solo se l'interprete viene compilato con l'opzione del garbage collector (NdT: raccoglitore della garbage) ciclico (abilitata in modo predefinito). Se non viene abilitata, viene sollevata l'eccezione ImportError nel tentativo di importare questo modulo.

Il modulo fornisce un' interfaccia al garbage collector facoltativo. Prevede le possibilità di disabilitare il raccoglitore, di regolare la frequenza di raccolta e di impostare le opzioni di debug. Fornisce inoltre accesso ad oggetti irragiungibili che il raccoglitore trova ma non può liberare. Poichè il raccoglitore integra il conteggio dei riferimenti già usati in Pyhton, è possibile disabilitarlo se si è sicuri che il programma non creerà dei riferimenti ciclici. La raccolta automatica può venire disabilitata chiamando gc.disable(). Per fare il debug di un programma difettoso chiamate gc.set_debug(gc.DEBUG_LEAK).

Il modulo gc fornisce le seguenti funzioni:

enable( )
Abilita automaticamente la garbage collection (NdT: raccolta garbage).

disable( )
Disabilita automaticamente la garbage collection.

isenabled( )
Restituisce vero se la garbage collection automatica viene abilitata.

collect( )
Avvia una raccolta completa. Tutte le generazioni vengono esaminate e viene restituito il numero degli oggetti irragiungibili.

set_debug( flags)
Imposta le opzioni di debugging della garbage collection. Le informazioni di debug verranno scritte su sys.stderr. Vedete più avanti per un elenco delle opzioni di debug che possono venire combinate usando le operazioni sui bit per il controllo del debug.

get_debug( )
Restituisce le opzioni di debug correntemente impostate.

get_objects( )
Restituisce una lista di tutti gli oggetti tracciati dal raccoglitore, ad esclusione della lista restituita. Nuovo nella versione 2.2.

set_threshold( threshold0[, threshold1[, threshold2]])
Imposta la soglia della garbage collection (la frequenza della raccolta). Impostando threshold0 a zero la raccolta viene disabilitata.

Il GC classifica gli oggetti in tre generazioni, a seconda del numero di raccolte a cui sono sopravvissuti. I nuovi oggetti vengono posti nella generazione più giovane (generazione 0). Se un oggetto sopravvive alla raccolta, viene spostato nella successiva generazione più vecchia. Poichè la generazione 2 è la più vecchia, gli oggetti in quella generazione rimangono lì dopo una raccolta. Per poter decidere il momento necessario per avviare la raccolta, il raccoglitore tiene traccia del numero degli oggetti allocati e deallocati dall'ultima raccolta. Quando il numero di allocazioni meno il numero delle deallocazioni è superiore a threshold0, la raccolta inizia. Inizialmente viene esaminata solo la generazione 0. Se la generazione 0 viene stata esaminata un numero di volte superiore a threshold1 da quando è stata esaminata la generazione 1, allora anche la generazione 1 viene presa in considerazione. In maniera simile threshold2 controlla il numero di raccolte della generazione 1 prima di raccogliere la generazione 2.

get_threshold( )
Restituisce le soglie correnti di acquisizione come una tupla di valori (threshold0, threshold1, threshold2).

get_referrers( *objs)
Restituisce la lista di oggetti che vengono direttamente riferiti a ciascuno degli objs. Questa funzione individuerà solo quei contenitori che supportano la garbage collection; i tipi di estensione che si possono riferire ad altri oggetti ma che non supportano la garbage collection non verranno individuati.

Notate che gli oggetti che sono già stati dereferenziati, ma che vivono nei cicli e che non sono ancora stati raccolti dal garbage collector possono venire elencati tra i risultati riferibili. Per ottenere solo oggetti correntemente attivi chiamate collect() prima di chiamare get_referrers().

Dovete fare attenzione quando usate oggetti restituiti da get_referrers() perché alcuni di questi potrebbero essere ancora in costruzione e quindi in uno stato temporaneamente non valido. Evitate di usare get_referrers() per altri scopi oltre al debugging.

Nuovo nella versione 2.2.

get_referents( *objs)
Restituisce una lista di oggetti direttamente riferiti a ciascuno degli argomenti. I riferimenti restituiti sono quegli oggetti esaminati dagli argomenti dei metodi di livello C tp_traverse (se ci sono), e possono non tutti momentaneamente essere oggetti direttamente raggiungibili. I metodi tp_traverse vengono supportati solo dagli oggetti che supportano la garbage collection, e vengono richiesti solamente per esaminare oggetti che possono venire impiegati all'interno di un ciclo. Così, per esempio, se un intero è direttamente raggiungibile da un argomento, quell'oggetto intero può o meno apparire nell'elenco dei risultati.

Nuovo nella versione 2.3.

La variabile seguente viene fornita per accessi in sola lettura (potete cambiare il suo valore, ma non dovreste riassegnarla):

garbage
Una lista di oggetti che il raccoglitore trova essere irraggiungibili ma che potrebbero non essere liberati (oggetti non raccoglibili). In modo predefinito, la lista contiene solo oggetti con metodo __del__().3.1 Oggetti che hanno metodi __del__() e che sono parte di un ciclo di riferimento, fanno sì che un intero ciclo di riferimenti non sarà raccoglibile, inclusi gli oggetti non necessariamente presenti nel ciclo ma raggiungibili solo da esso. Python non raccoglie automaticamente questi cicli, perché, normalmente, non è possibile per Python stesso conoscere un ordine sicuro per lanciare il metodo __del__(). Se conoscete un sistema sicuro, potete forzare l'operazione esaminando la garbage list, ed interrompendo esplicitamente i cicli dovuti agli oggetti presenti nella lista. Notate che questi oggetti vengono mantenuti vivi fintanto che si trovano nella garbage list, per cui, per eliminarli definitivamente dovranno essere rimossi dalla garbage list stessa. Per esempio, dopo aver interrotto dei cicli, richiamate del del gc.garbage[:] per svuotare la lista. È generalmente preferibile evitare il problema, non creando cicli contenenti oggetti con metodi __del__(), e garbage può venire esaminata per verificare che questi cicli non vengano creati.

Se DEBUG_SAVEALL è stata impostata, tutti gli oggetti non raggiungibili verranno aggiunti alla lista invece che liberati.

Le seguenti costanti vengono fornite per venire usate con set_debug():

DEBUG_STATS
Stampa le statistiche durante la raccolta. Questa informazione può essere utile mentre si regola la frequenza di raccolta.

DEBUG_COLLECTABLE
Stampa informazioni sugli oggetti riciclabili individuati.

DEBUG_UNCOLLECTABLE
Stampa informazioni sugli oggetti non riciclabili individuati (oggetti che risultano essere non raggiungibili ma che non possono veniree liberati dal raccoglitore). Questi oggetti verranno aggiunti alla garbage list.

DEBUG_INSTANCES
Quando DEBUG_COLLECTABLE o DEBUG_UNCOLLECTABLE viene impostata, stampa informazioni circa le istanze di oggetti trovate.

DEBUG_OBJECTS
Quando DEBUG_COLLECTABLE o DEBUG_UNCOLLECTABLE viene impostata, stampa informazioni circa gli oggetti istanze diversi da quelli rinvenuti.

DEBUG_SAVEALL
Quando impostata, tutti gli oggetti non raggiungibili trovati verranno aggiunti a garbage piuttosto che venire liberati. Questo comportamento può risultare utile per fare il debug di un programma difettoso.

DEBUG_LEAK
Le opzioni per il debugging necessarie al raccoglitore per stampare le informazioni circa un programma difettoso (uguali a DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_INSTANCES | DEBUG_OBJECTS | DEBUG_SAVEALL).


Footnotes

...__del__().3.1
Prima di Python 2.2, la lista conteneva tutti gli oggetti istanziati in cicli non raggiungibili, non soltanto quelli con metodi __del__().
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.