Использование памяти, если многопроцессорная очередь не используется двумя отдельными процессами - PullRequest
0 голосов
/ 29 января 2019

В моей программе на python есть нить, которая получает изображения с веб-камеры и помещает их в многопроцессорную очередь.Затем отдельный процесс берет эти изображения из очереди и выполняет некоторую обработку.Тем не менее, если я пытаюсь очистить очередь из потока получения изображения (производителя), я не освобождаю память, и программа в конечном итоге использует всю доступную память и выдает сбой компьютера (Python 3.6.6 / Ubuntu 18.04 64bit / Linux 4.15.0-43-generic)

У меня есть простой рабочий пример, который воспроизводит проблему.

import multiprocessing
import time
import numpy as np

queue_mp = multiprocessing.Queue(maxsize=500)

def producer(q):
    while True:
        # Generate object to put in queue
        dummy_in = np.ones((1000,1000))

        # If the queue is full, get the oldest object (FIFO),
        # to make space for the latest incoming object.
        if q.full():
            __ = q.get()
        q.put(dummy_in)


def consumer(q):
    while True:
        # Get object from queue
        dummy_out = q.get()

        # Do some processing on the object, which we simulate here by time.sleep
        time.sleep(3)

producer_process = multiprocessing.Process(target=producer,
                                           args=(queue_mp,),
                                           daemon=False)

consumer_process = multiprocessing.Process(target=consumer,
                                           args=(queue_mp,),
                                           daemon=False)

# Start producer and consumer processes
producer_process.start()
consumer_process.start()

Я могу переписать свой код, чтобы избежать этой проблемы, но я хотел бы понять, чтоэто происходит.Существует ли общее правило, согласно которому производители и потребители многопроцессорной очереди должны работать в отдельных процессах?

Если кто-то понимает, почему это происходит, или что именно происходит за кулисами многопроцессорных очередейчто бы объяснить это поведение памяти, я был бы признателен.Документы не вдавались в подробности.

1 Ответ

0 голосов
/ 30 января 2019

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

Моя проблема с памятью возникла из-за ошибки numpy в версии 1.16.0.Возврат к простой версии 1.13.3 решил проблему.

Чтобы ответить на основной вопрос: Нет, не нужно беспокоиться, какой поток / процесс потребляет (get), а какой поток / процесссоздание (put) для многопроцессорных очередей.В многопроцессорных очередях нет ничего особенного в отношении сборки мусора.Как объясняет kindall в ответ на аналогичный вопрос :

Когда больше нет ссылок на объект, занимаемая им память освобождается немедленно иможет быть использован другими объектами Python

Надеюсь, это кому-нибудь поможет.В любом случае, значительная ошибка должна быть исправлена ​​в выпуске 1.16.1.

...