Список Python не освобождает память после очистки списка - PullRequest
0 голосов
/ 05 октября 2018

У меня есть скрипт на python, в котором есть глобальная переменная object_list

Я запускаю 5 параллельных потоков, вызывающих функцию для чтения objects из SQS и добавления в тот же список.Как показано ниже: -

object_list = []
def operate(obj_array):
    for obj in obj_array:
        # some calculation.
        # obj is of type dict.
        obj.clear()
    # either i can clear each object in the for loop or delete the obj_array at the end.
    del obj_array

def append_to_list(sqs):
    global object_list
    object_list.append(sqs)
    if len(object_list) > 100:
        o = Thread(target=operate, args=(object_list,))
        o.start()
        object_list = []

def object_reader(process_number):
    print process_number
    for msg in queue.get_messages():
        obj = json.loads(msg.get_body())
        t = Thread(target=append_to_list, args=(obj,))
        t.start()

for x in xrange(5):
    t = Thread(target=object_reader, args=(x,))
    t.start()

Как показано в приведенном выше коде, я хочу, чтобы программа запустила 5 потоков для чтения из SQS и добавила объекты в один глобальный список.

Как только длина списка превысила 100 iЯ хочу работать с этим списком в другом потоке, а также сделать глобальный список пустым, чтобы повторить то же самое.

Проблема заключается в том, что моя программа работает в бесконечном цикле (24x7), но память сценариев продолжает увеличиваться и превышатьограничение контейнера, которое приводит к уничтожению контейнера.

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

1 Ответ

0 голосов
/ 05 октября 2018

У вас может быть свисающая ссылка на объект, на который указывает имя object_list, поэтому объект никогда не получает мусор.

Выполнение object_list = [] назначит новый пустой список глобальному имени object_list, но не изменяйте существующий, возможно, висящий, объект списка, на который указывает это имя.

Вместо этого вы можете захотеть очистить весь список на месте с помощью назначения среза:

object_list[:] = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...