Załóżmy, że mam naprawdę dużą klasę Pythona, która może zużywać sporą ilość pamięci. Klasa ma jakąś metodę, która jest odpowiedzialna za sprzątanie pewne rzeczy, gdy interpreter wychodzi i robi zarejestrowany z modułem atexit:Jakie są implikacje rejestracji metody instancji w atexit w Pythonie?
import atexit
import os
class ReallyBigClass(object):
def __init__(self, cache_file):
self.cache_file = open(cache_file)
self.data = <some large chunk of data>
atexit.register(self.cleanup)
<insert other methods for manipulating self.data>
def cleanup(self):
os.remove(self.cache_file)
różne instancje tej klasy może przychodzą i odchodzą przez cały okres trwania programu. Moje pytania to:
Czy rejestracja metody instancji z atexit jest bezpieczna, jeśli, na przykład, del
wszystkie moje inne odniesienia do instancji? Innymi słowy, czy atexit.register()
zwiększa licznik referencyjny w taki sam sposób jak tradycyjne wiązanie? Jeśli tak, to czy cała instancja klasy musi się teraz zawiesić w pamięci i czekać do końca, ponieważ jedna z jej metod została zarejestrowana z atrybutem atexit, lub czy fragmenty instancji mogą zostać usunięte? Jaki byłby preferowany sposób struktury takiego czyszczenia przy wyjściu dla tymczasowych instancji klasy, tak aby odśmiecanie mogło się odbywać skutecznie?