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

2023-12-02

我的 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(使用前将#替换为@)

如果两个单独的进程不使用多处理队列,则内存使用 的相关文章

随机推荐

  • 从 C 到 Java 传递指针变成 NULL

    我正在开发一个适用于 x86 的 Android 应用程序 需要与 C 进行一些集成 我一直在使用 swig JNI 来实现这一点 并且大部分情况都运行顺利 然而 指针给了我一些错误 我的问题是 我能够成功引用模拟器 ARM 中的变量地址
  • 来自索引 URL 的 Angular2 查询参数

    我正在尝试从 Angular2 组件中的 url 获取查询参数 版本 angular2 npm 电子邮件受保护 我正在尝试提取组件中的 id 查询参数并显示它 这是请求 本地主机 8080 index html id 1 boot ts i
  • Oracle SQL 比较日期

    SQL gt select from porder OID BILL ODATE 10 200 06 OCT 13 4 39878 05 OCT 13 5 430000 05 OCT 13 11 427 06 OCT 13 12 700 0
  • 选择十进制形式的浮点数

    我在 PostgreSQL 表中有一个小数字 test CREATE TABLE test r real CREATE TABLE test INSERT INTO test VALUES 0 00000000000000000000000
  • 通过 ACE.OLEDB 从 Excel 进行 sqlbulkcopy 将文本截断为 255 个字符

    使用 SqlBulkCopy 非常直接的导入 string excelConnectionString Provider Microsoft ACE OLEDB 12 0 Data Source filePath Extended Prop
  • 暂存实例还是生产实例?

    服务运行时中是否有任何地方可以告诉我当前是在 暂存 还是 生产 上运行 在生产环境中手动修改配置似乎有点麻烦 当您处于 Prod 或 Staging 状态时 您确实不应该更改配置 暂存区域并非设计为 QA 环境 而只是部署生产之前的等待区域
  • 《Java 8 in Action》提供的演示有误吗?

    这段代码是引用自Java 8 实践 这也在书 11 4 3 中 public Stream
  • JSON.parse 是用什么写的/它是开源的吗?

    PHP 函数是用 C 编写的 如果您愿意 可以查看源代码 例如这里 会话启动源 那么 JavaScript 呢 像 JSON parse 这样的函数是如何实现的 我可以去哪里查看源码 Thanks JSON parse 是原生的 这意味着它
  • Solr DataImportHandler 配置

    我想在 DataImportHandler 的帮助下从 mysql 数据库获取数据 这样我就可以创建索引 现在我已经配置了 Solr 实例 以便它可以在 Tomcat 示例管理页面 上运行 但如果我尝试更改 sorlconfig xml 文
  • 排序数组列表方法很慢

    首先要说的是 我看到了非常相似的问题 但我认为这不是重复的 我需要对字符串数组列表进行排序 其中列表成员的格式为ID NAME以及哪里ID是某个数字并且name一些字符串 我使用的第一个想法很简单 ArrayList
  • 检查用户名是否已存在于数据库 MySQL PHP [重复]

    这个问题在这里已经有答案了 我制作了一个 Registration php 页面 我需要检查用户名是否已在我的数据库中 这样我就不会有 2 个同名的成员 以下是我将用户信息插入数据库的方法 用户名 密码 注册日期等 mysql query
  • 将箭头样式函数转换为“函数”样式

    我有一个这样的函数 const jsonObject a b c const x a b const properties x split const item properties reduce obj prop gt obj obj p
  • C++11:intptr_t/int_ptr_t、intmax_t/int_max_t?

    我正在阅读一些关于 c 11 的文章 我注意到一些关于 int 类型名称的事情 目前 显然该规范只能通过付费才能获得 但二月份的早期草案可在http www open std org jtc1 sc22 wg21 docs papers 2
  • 如何从 calcOpticalFlowFarneback 中提取像素的速度矢量

    我一直在寻找提取两帧中每个像素的速度向量 我使用 opencv 函数作为流程 calcOpticalFlowFarneback Previous Gray Current Gray Optical Flow 0 5 3 15 3 5 1 2
  • 类型“Key”不能用于索引类型“Object”

    尝试用声音类型实现功能性的拨动 但我做错了一些事情 function pluck key Key o Object gt Object Key return object gt object key TS错误 类型 Key 不能用于索引类型
  • 在 jquery ajax 中从 JS 端的 JsonResult 获取属性

    我返回以下对象 JsonResult return new JsonResult Data new ErrorMessage message ContentEncoding System Text Encoding UTF8 JsonReq
  • Powershell 无法从命令提示符创建 Outlook COM 对象

    我有一个用于从命令提示符通过 Microsoft Outlook 发送邮件的脚本 如果我从 PowerShell 或 ISE 控制台内部运行它 则效果很好 但是 当我尝试从经典 Windows 命令提示符 cmd exe 执行相同操作时 即
  • 在文本小部件中搜索单词/字母 (tkinter)

    我将如何添加在文本小部件中搜索文本的搜索功能 根据用户输入进行搜索 def openFile global text artiststxt tkinter Tk artiststxt title Artists artiststxt geo
  • Python xlwt - 使列只读(单元格保护)

    有没有办法在 python xlwt 中使特定单元格只读 写保护 我知道有一个 cell overwrite ok 标志 它不允许覆盖单元格 所有单元格 的内容 但这可以逐个单元格地完成 谢谢 太阳 Excel 单元格有一个locked默认
  • 如果两个单独的进程不使用多处理队列,则内存使用

    我的 python 程序中有一个线程 它从网络摄像头获取图像并将它们放入多处理队列中 然后 一个单独的进程从队列中取出这些图像并进行一些处理 但是 如果我尝试从图像采集 生产者 线程清空队列 则不会释放任何内存 并且该程序最终会使用所有可用