Опорные циклы при использовании инспекционного модуля - PullRequest
0 голосов
/ 06 февраля 2019

Документация говорит :

Примечание Хранение ссылок на объекты фрейма, как найдено в первом элементе записей фрейма, возвращаемых этими функциями, можетзаставить вашу программу создавать эталонные циклы.После создания эталонного цикла срок жизни всех объектов, к которым можно получить доступ из объектов, образующих цикл, может значительно увеличиться, даже если включен дополнительный детектор циклов Python.Если такие циклы должны быть созданы, важно убедиться, что они явно нарушены, чтобы избежать отложенного разрушения объектов и увеличения потребления памяти.

Несмотря на то, что детектор циклов поймает их, уничтожение кадров (илокальные переменные) можно сделать детерминированными, удалив цикл в предложении finally.Это также важно, если детектор цикла был отключен при компиляции Python или использовании gc.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()?Любые другие методы / обстоятельства?

...