【发布时间】:2019-01-29 10:33:37
【问题描述】:
我的 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()
我可以重写我的代码来避免这个问题,但我想了解发生了什么。是否存在多处理队列的生产者和消费者必须在不同进程中运行的一般规则?
如果有人理解为什么会发生这种情况,或者在多处理队列的幕后究竟发生了什么来解释这种内存行为,我将不胜感激。文档没有详细说明。
【问题讨论】:
标签: python-3.x memory-management multiprocessing