Ручная сборка мусора в Python
Есть ли способ вручную удалить объект, который сбор мусора отказывается избавиться даже после вызова gc.collect()
? Работа в Python 3.0
Ответы
Ответ 1
Per документы, gc.get_referrers(thatobject)
расскажет вам, почему объект все еще жив (сделайте это сразу после gc.collect()
, чтобы убедиться нежелательная "живучесть" будет настойчивой). После этого это как-то черное искусство;-). Вы часто обнаружите, что некоторые из рефереров являются списками (поэтому ПОЧЕМУ этот список относится к thatobject
? Вы можете .remove
его в аварийном режиме, но лучше сделать нормальный звук кода...) и, все чаще, dict
(многие из которых могут быть __dict__
какого-либо экземпляра класса или другого, часто не являются тривиальными, чтобы выяснить, какой из них... снова, удаление грубой силы иногда является целесообразным экстренным решением, но никогда устойчивый долгосрочный! -).
Ответ 2
Если GC отказывается уничтожить его, это потому, что у вас есть ссылка на него где-то. Избавьтесь от ссылки, и она (в конце концов) уйдет. Например:
myRef = None
Имейте в виду, что GC может не обязательно уничтожать ваш объект, если это не нужно.
Если ваш объект хранит ресурсы не под управлением Python (например, некоторые обманки с кодом C, вызываемым из Python), объект должен предоставлять вызов для выпуска ресурса, чтобы вы могли делать это, когда хотите, а не когда Python решает.
Ответ 3
del
Или None
являются вашими друзьями
>>> a = "Hello"
>>> a = None
Or
>>> del a
Ответ 4
Это зависит от того, что работает ваш Python. Здесь хорошая статья, которая объясняет детали
Цитирование:
В текущих выпусках CPython каждое новое назначение x внутри цикла освободит ранее выделенный ресурс. Используя GC, это не гарантируется. Если вы хотите написать код, который будет работать с любой реализацией Python, вы должны явно закрыть ресурс; это будет работать независимо от GC:
for name in big_list:
x = Resource()
do something with x
x.close()