Когда я определяю поток как переменную экземпляра, другие определенные объекты не собираются мусором. В этом примере массив буфер создается в каждой итерации l oop, который никогда не собирается сборщиком мусора:
import array
import gc
import threading
from pympler import muppy
class A():
def __init__(self):
self.buffer = array.array('B')
# Defining a thread keeps array in memory
self.thread = threading.Thread(target=lambda *_: None)
if __name__ == '__main__':
for i in range(10):
a = A()
# del a # needed
gc.collect()
print('Iteration {}:'.format(i))
obj = muppy.get_objects()
print('Array objects {}'.format(len(muppy.filter(obj, Type=array.ArrayType))))
print('Thread objects {}'.format(len(muppy.filter(obj, Type=threading.Thread))))
print('Running threads {}'.format(len(threading.enumerate())))
Вывод:
Iteration 0:
Array objects 1
Thread objects 2
Running threads 1
Iteration 1:
Array objects 2
Thread objects 3
Running threads 1
...
Неважно, запущен ли поток + присоединен или нет. Явное удаление объекта buffer или self.thread позволяет выполнять сборку мусора. Я не могу понять это поведение и был бы признателен за некоторые объяснения. В моем рабочем коде эта функция в конечном итоге приводит к завершению нехватки памяти экземпляра python.