如果两个单独的进程未使用多处理队列,则使用内存

时间:2019-01-29 10:33:37

标签: python-3.x memory-management multiprocessing

我的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()

我可以重写代码来避免此问题,但是我想了解发生了什么。是否有一个通用规则,即多处理队列的生产者和消费者必须必须在单独的进程中运行?

如果有人能理解为什么会这样,或者在多处理队列的幕后究竟发生了什么,可以解释这种内存行为,我将不胜感激。这些文档没有详细介绍。

1 个答案:

答案 0 :(得分:0)

我知道发生了什么事,所以我将其发布在这里,以帮助那些偶然发现问题的人。

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

要回答一个基本问题:不需要,不必担心哪个线程/进程正在进行消费(get)和哪个线程/进程正在进行生产(put)以进行多处理队列。关于垃圾收集的多处理队列没有什么特别的。正如kindallsimilar question的回应所解释:

  

当不再有对对象的引用时,它所占用的内存会立即释放,并可以由其他Python对象重用

我希望能对某人有所帮助。无论如何,numpy错误应在1.16.1版本中解决。