首页 > 解决方案 > 如果两个单独的进程不使用多处理队列,则内存使用情况

问题描述

我的 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.xmemory-managementmultiprocessing

解决方案


我弄清楚发生了什么,所以我将其发布在这里,以帮助任何偶然发现问题的人。

我的内存问题是由numpy 版本 1.16.0 中的一个numpy 错误引起的。恢复到 numpy 版本 1.13.3 解决了这个问题。

回答基本问题:不,无需担心哪个线程/进程正在执行消费(get)以及哪个线程/进程正在为多处理队列执行生产(put)。多处理队列在垃圾收集方面没有什么特别之处。正如kindall在回答类似问题时解释的那样:

当一个对象不再有任何引用时,它占用的内存会立即被释放,并且可以被其他 Python 对象重用

我希望这对某人有所帮助。无论如何,numpy 的 bug 应该在 1.16.1 版本中得到解决。


推荐阅读