Почему Python сборка мусора с потоками не работает? - PullRequest
0 голосов
/ 02 марта 2020

Когда я определяю поток как переменную экземпляра, другие определенные объекты не собираются мусором. В этом примере массив буфер создается в каждой итерации 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.

...