【问题标题】:Memory use if multiprocessing queue is not used by two separate processes如果两个单独的进程不使用多处理队列,则内存使用情况
【发布时间】: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


    【解决方案1】:

    我知道发生了什么,所以我会在这里发布它,以帮助任何偶然发现问题的人。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多