В моей программе на 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()
Я могу переписать свой код, чтобы избежать этой проблемы, но я хотел бы понять, чтоэто происходит.Существует ли общее правило, согласно которому производители и потребители многопроцессорной очереди должны работать в отдельных процессах?
Если кто-то понимает, почему это происходит, или что именно происходит за кулисами многопроцессорных очередейчто бы объяснить это поведение памяти, я был бы признателен.Документы не вдавались в подробности.