Как освободить multiprocessing.sharedctypes.RawValue и multiprocessing.sharedctypes.RawArray?

В Python 3.8 у меня есть несколько значений общей памяти, например:

from multiprocessing.sharedctypes import RawArray, RawValue

...

sm_best_score_gpu_id = RawValue(ctypes.c_double, -1)
sm_positions = RawArray(ctypes.c_int32, genome_positions)

Это должно быть перераспределено время от времени. Если я просто повторю эти операции в цикле, будет ли эта память автоматически освобождена при сборке мусора исходных переменных?

Я просматриваю документы ctypes, но не нашел ничего, связанного с освобождением памяти.

Как я могу освободить эту память?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все должно быть в порядке. Сборка мусора может происходить не сразу. В интерпретаторах, отличных от CPython, таких как PyPy, Jython и т. д., вся коллекция недетерминирована. В CPython («референсном» интерпретаторе, который, что вполне уместно, подсчитывает ссылки), сборка является детерминированной, когда не задействованы циклы ссылок, но если цикл ссылок формируется (что может произойти случайно в странных случаях, таких как возбуждение исключений, содержащих кадры в их трассировки), и один из этих объектов прикреплен к чему-то в цикле, он не будет очищен до тех пор, пока сам цикл не будет собран, что произойдет в неопределенное время в будущем (и может вообще не произойти, если сборщик циклов отключено с помощью gc.disable(), или выдающиеся объекты заморожены с помощью gc.freeze()).

До тех пор, пока «в конечном итоге очищается» нормально, и вы не мешаете циклическому сборщику мусора, очистка в конечном итоге произойдет (базовый тип использует финализатор, чтобы гарантировать освобождение памяти обратно в общую кучу, из которой она была получена ).

Приходя из мира C/C++, я беспокоился об утечке памяти. Но если его в конце концов почистить, то все в порядке. Большое спасибо!

Edy Bourne 14.12.2020 21:16

Другие вопросы по теме