|
|
|
La libreria di riferimento di Python |
|
|
|
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:
-
Abilita automaticamente la garbage collection (NdT: raccolta garbage).
-
Disabilita automaticamente la garbage collection.
-
Restituisce vero se la garbage collection automatica viene abilitata.
-
Avvia una raccolta completa. Tutte le generazioni vengono
esaminate e viene restituito il numero degli oggetti irragiungibili.
-
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.
-
Restituisce le opzioni di debug correntemente impostate.
-
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
.
-
Restituisce le soglie correnti di acquisizione come una tupla di valori
(threshold0, threshold1, threshold2)
.
-
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.
-
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__().
|
|
|
La libreria di riferimento di Python |
|
|
|
Release 2.3.4, documentation updated on 21. maggio 2005.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.