Опорные циклы при использовании инспекционного модуля
В документации сказано:
Примечание. Сохранение ссылок на объекты фреймов, как указано в первом элементе записей фреймов, возвращаемых этими функциями, может привести к тому, что ваша программа создаст циклы ссылок. После создания эталонного цикла срок жизни всех объектов, к которым можно получить доступ из объектов, образующих цикл, может значительно увеличиться, даже если включен дополнительный детектор циклов Python. Если такие циклы должны быть созданы, важно убедиться, что они явно нарушены, чтобы избежать отложенного разрушения объектов и увеличения потребления памяти.
Хотя детектор цикла поймает их, разрушение кадров (и локальных переменных) можно сделать детерминированным, удалив цикл в
finally
пункт. Это также важно, если детектор цикла был отключен во время компиляции или использования Pythongc.disable()
, Например:def handle_stackframe_without_leak(): frame = inspect.currentframe() try: # do something with the frame finally: del frame
Если вы хотите сохранить рамку (например, чтобы напечатать трассировку позже), вы также можете прервать циклы ссылок, используя
frame.clear()
метод.
Что предположительно означает, что есть две вещи, которые имеют ссылки друг на друга. Что именно они?
Можете ли вы объяснить более точно, при каких условиях создается эталонный цикл? Когда я делаю inspect.currentframe()
без del frame
? То же самое для inspect.stack()
? Любые другие методы / обстоятельства?