Документация Python неофициальный перевод

29.11. gc – Интерфейс сборщика мусораgc – Garbage Collector interface

Этот модуль предоставляет интерфейс к опциональному сборщику мусора. Он позволяет отключить сборщик, настроить частоту сборки и установить параметры отладки. Также предоставляет доступ к недостижимым объектам, которые сборщик нашёл, но не может освободить. Поскольку сборщик дополняет подсчёт ссылок, уже используемый в Python, вы можете отключить сборщик, если уверены, что ваша программа не создаёт циклические ссылки. Автоматическую сборку можно отключить вызовом gc.disable(). Для отладки программы с утечками вызовите gc.set_debug(gc.DEBUG_LEAK). Обратите внимание, что это включает gc.DEBUG_SAVEALL, в результате чего объекты, собранные сборщиком мусора, сохраняются в gc.garbage для проверки.

Модуль gc предоставляет следующие функции:

gc.enable()

Включить автоматическую сборку мусора.

gc.disable()

Отключить автоматическую сборку мусора.

gc.isenabled()

Возвращает истину, если автоматическая сборка включена.

gc.collect(generations=2)

Без аргументов выполняет полную сборку. Необязательный аргумент generation может быть целым числом, указывающим, какое поколение собирать (от 0 до 2). Если номер поколения недействителен, возбуждается ValueError. Возвращается количество найденных недостижимых объектов.

Свободные списки, поддерживаемые для ряда встроенных типов, очищаются при каждой полной сборке или сборке самого старшего поколения (2). Не все элементы в некоторых свободных списках могут быть освобождены из-за особенностей реализации, в частности float.

gc.set_debug(flags)

Устанавливает флаги отладки сборки мусора. Отладочная информация будет записываться в sys.stderr. См. ниже список флагов отладки, которые можно комбинировать с помощью побитовых операций для управления отладкой.

gc.get_debug()

Возвращает текущие установленные флаги отладки.

gc.get_objects()

Возвращает список всех объектов, отслеживаемых сборщиком, за исключением возвращаемого списка.

gc.get_stats()

Возвращает список из трёх словарей по поколениям, содержащих статистику сборки с момента запуска интерпретатора. Количество ключей может измениться в будущем, но в настоящее время каждый словарь содержит следующие элементы:

  • collections – количество раз, когда это поколение было собрано;
  • collected – общее количество объектов, собранных внутри этого поколения;
  • uncollectable – общее количество объектов, которые оказались несобираемыми (и поэтому были перемещены в список garbage) внутри этого поколения.

Новое в версии 3.4.

gc.set_threshold(threshold0[, threshold1[, threshold2]])

Устанавливает пороги сборки мусора (частоту сборки). Установка threshold0 в ноль отключает сборку.

Сборщик мусора классифицирует объекты по трём поколениям в зависимости от того, сколько циклов сборки они пережили. Новые объекты помещаются в самое молодое поколение (поколение 0). Если объект переживает сборку, он перемещается в следующее более старое поколение. Поскольку поколение 2 является самым старым, объекты в этом поколении остаются там после сборки. Чтобы решить, когда запускаться, сборщик отслеживает количество выделений и освобождений объектов с момента последней сборки. Когда количество выделений минус количество освобождений превышает threshold0, начинается сборка. Изначально проверяется только поколение 0. Если поколение 0 проверялось более threshold1 раз с тех пор, как проверялось поколение 1, то также проверяется поколение 1. Аналогично, threshold2 управляет количеством сборок поколения 1 перед сборкой поколения 2.

gc.get_count()

Возвращает текущие счётчики сборки в виде кортежа (count0, count1, count2).

gc.get_threshold()

Возвращает текущие пороги сборки в виде кортежа (threshold0, threshold1, threshold2).

gc.get_referrers(*objs)

Возвращает список объектов, которые напрямую ссылаются на любой из objs. Эта функция находит только те контейнеры, которые поддерживают сборку мусора; типы расширений, которые ссылаются на другие объекты, но не поддерживают сборку мусора, найдены не будут.

Обратите внимание, что объекты, на которые уже нет ссылок, но которые находятся в циклах и ещё не были собраны сборщиком мусора, могут быть перечислены среди результирующих ссылающихся объектов. Чтобы получить только текущие живые объекты, вызовите collect() перед вызовом get_referrers().

Следует соблюдать осторожность при использовании объектов, возвращаемых get_referrers(), поскольку некоторые из них могут всё ещё находиться в процессе построения и, следовательно, во временно недействительном состоянии. Избегайте использования get_referrers() для любых целей, кроме отладки.

gc.get_referents(*objs)

Возвращает список объектов, на которые непосредственно ссылается любой из аргументов. Возвращаемые референты – это объекты, посещаемые C-уровневым методом tp_traverse аргументов (если он есть), и могут не включать все объекты, фактически достижимые напрямую. Методы tp_traverse поддерживаются только объектами, которые поддерживают сборку мусора, и требуются только для посещения объектов, которые могут быть вовлечены в цикл. Так, например, если целое число напрямую достижимо из аргумента, этот объект целого числа может как появиться, так и не появиться в результирующем списке.

gc.is_tracked(obj)

Возвращает True, если объект в настоящее время отслеживается сборщиком мусора, и False в противном случае. Как правило, экземпляры атомарных типов не отслеживаются, а экземпляры неатомарных типов (контейнеры, пользовательские объекты...) отслеживаются. Однако могут присутствовать некоторые оптимизации для конкретных типов, чтобы уменьшить влияние на сборщик мусора для простых экземпляров (например, словари, содержащие только атомарные ключи и значения):

>>> gc.is_tracked(0)
False
>>> gc.is_tracked("a")
False
>>> gc.is_tracked([])
True
>>> gc.is_tracked({})
False
>>> gc.is_tracked({"a": 1})
False
>>> gc.is_tracked({"a": []})
True

Новое в версии 3.1.

Следующие переменные предназначены для доступа только для чтения (можно изменять их значения, но не следует их переназначать):

gc.garbage

Список объектов, которые сборщик нашёл недостижимыми, но не смог освободить (несобираемые объекты). Начиная с Python 3.4, этот список большую часть времени должен быть пуст, за исключением случаев использования экземпляров типов C-расширений с ненулевым слотом tp_del.

Если установлен DEBUG_SAVEALL, то все недостижимые объекты будут добавлены в этот список, а не освобождены.

Изменено в версии 3.2: Если при завершении интерпретатора этот список не пуст, выдается ResourceWarning, которая по умолчанию молчалива. Если также установлен DEBUG_UNCOLLECTABLE, дополнительно выводятся все несобираемые объекты.

Изменено в версии 3.4: В соответствии с PEP 442, объекты с методом __del__() больше не попадают в gc.garbage.

gc.callbacks

Список колбэков, которые будут вызываться сборщиком мусора до и после сборки. Колбэки будут вызываться с двумя аргументами: phase и info.

phase может принимать одно из двух значений:

“start”: сборка мусора начинается.

“stop”: сборка мусора завершена.

info – это словарь, предоставляющий дополнительную информацию для колбэка. В настоящее время определены следующие ключи:

“generation”: самое старое поколение, участвующее в сборке.

“collected”: когда phase равен “stop”, количество успешно собранных объектов.

«uncollectable»: когда phase равен «stop», количество объектов, которые не удалось собрать и которые были помещены в garbage.

Приложения могут добавлять свои собственные колбэки в этот список. Основные случаи использования:

Сбор статистики о сборке мусора, например, как часто собираются различные поколения и сколько времени занимает сборка.

Позволяет приложениям определять и очищать свои собственные несобираемые типы, когда они появляются в garbage.

Новое в версии 3.3.

Следующие константы предоставляются для использования с set_debug():

gc.DEBUG_STATS

Вывод статистики во время сборки. Эта информация может быть полезна при настройке частоты сборки.

gc.DEBUG_COLLECTABLE

Вывод информации о найденных собираемых объектах.

gc.DEBUG_UNCOLLECTABLE

Выводит информацию о найденных несобираемых объектах (объекты, которые не являются достижимыми, но не могут быть освобождены сборщиком). Эти объекты будут добавлены в список garbage.

Изменено в версии 3.2: Также выводить содержимое списка garbage при завершении интерпретатора, если он не пуст.

gc.DEBUG_SAVEALL

Если установлен, все найденные недостижимые объекты будут добавляться в garbage, а не освобождаться. Это может быть полезно для отладки программы с утечками.

gc.DEBUG_LEAK

Флаги отладки, необходимые сборщику для вывода информации об утекающей программе (равны DEBUG_COLLECTABLE | DEBUG_UNCOLLECTABLE | DEBUG_SAVEALL).