我的 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()
我可以重写我的代码来避免这个问题,但我想了解发生了什么。是否存在多处理队列的生产者和消费者的一般规则must在单独的进程中运行?
如果有人理解为什么会发生这种情况,或者在多处理队列的幕后到底发生了什么来解释这种内存行为,我将不胜感激。该文档没有详细说明。
我弄清楚发生了什么,所以我将其发布在这里,以方便任何偶然发现问题的人。
我的记忆问题是由numpy bug在 numpy 版本 1.16.0 中。恢复到 numpy 版本 1.13.3 解决了该问题。
回答基本问题:不,无需担心哪个线程/进程正在消耗(get
)以及哪个线程/进程正在执行生产(put
) 用于多处理队列。就垃圾收集而言,多处理队列没有什么特别之处。作为kindall解释回应类似的问题:
当不再有任何对某个对象的引用时,它占用的内存将立即释放,并可以被其他 Python 对象重用
我希望这对某人有帮助。无论如何,numpy 错误应该在 1.16.1 版本中得到解决。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)