我的python程序中有一个线程,该线程从网络摄像头获取图像并将其放入多处理队列。然后,一个单独的过程从队列中获取这些图像并进行一些处理。但是,如果我尝试从图像获取(生产者)线程中清空队列,则不会释放任何内存,该程序最终会使用所有可用内存并使机器崩溃(Python 3.6.6 / Ubuntu 18.04 64bit / Linux 4.15。 0-43通用)
我有一个简单的可重现问题的示例。
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()
我可以重写代码来避免此问题,但是我想了解发生了什么。是否有一个通用规则,即多处理队列的生产者和消费者必须必须在单独的进程中运行?
如果有人能理解为什么会这样,或者在多处理队列的幕后究竟发生了什么,可以解释这种内存行为,我将不胜感激。这些文档没有详细介绍。
答案 0 :(得分:0)
我知道发生了什么事,所以我将其发布在这里,以帮助那些偶然发现问题的人。
我的内存问题是由numpy版本1.16.0中的 numpy bug引起的。恢复为numpy版本1.13.3解决了该问题。
要回答一个基本问题:不需要,不必担心哪个线程/进程正在进行消费(get
)和哪个线程/进程正在进行生产(put
)以进行多处理队列。关于垃圾收集的多处理队列没有什么特别的。正如kindall对similar question的回应所解释:
当不再有对对象的引用时,它所占用的内存会立即释放,并可以由其他Python对象重用
我希望能对某人有所帮助。无论如何,numpy错误应在1.16.1版本中解决。