Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Queue.get()内存泄漏_Python_Memory Leaks_Queue - Fatal编程技术网

Python Queue.get()内存泄漏

Python Queue.get()内存泄漏,python,memory-leaks,queue,Python,Memory Leaks,Queue,在使用get()方法清空队列后,我使用以下代码生成看起来像内存泄漏的内容 此脚本可以通过3种方式运行: Add n_将元素放入队列,然后将其清空 添加n_将元素放入队列,然后删除队列对象 Add n_将元素放入队列,然后清空它,然后删除队列对象 对于第一种和第三种情况,脚本似乎会产生内存泄漏,如下所示: 第一种情况下,在将元素放入队列之前,使用的mem为0.15%,清空后为2.22%: ######### del_在_为假之后del_在_为假之后n_为20000000 跑前 成员百分比0.15%

在使用get()方法清空队列后,我使用以下代码生成看起来像内存泄漏的内容

此脚本可以通过3种方式运行:

  • Add n_将元素放入队列,然后将其清空
  • 添加n_将元素放入队列,然后删除队列对象
  • Add n_将元素放入队列,然后清空它,然后删除队列对象
  • 对于第一种和第三种情况,脚本似乎会产生内存泄漏,如下所示:

    第一种情况下,在将元素放入队列之前,使用的mem为0.15%,清空后为2.22%:

    #########

    del_在_为假之后del_在_为假之后n_为20000000

    跑前

    成员百分比0.15%

    ------完成------qsize 20000000

    成员百分比37.61%

    ------完成------qsize 0

    成员百分比2.22%

    第三种情况,在将元素放入队列之前,使用的mem为0.15%,清空后为2.22%,删除对象后为2.22%:

    #########

    del_在_之后放假del_在_变成真后n_放20000000

    跑前

    成员百分比0.15%

    ------完成------qsize 20000000

    成员百分比37.61%

    ------完成------qsize 0

    成员百分比2.22%

    获取后删除队列

    成员百分比2.22%

    对于第二种情况,将所有元素放入队列并删除后,开始时的mem_pct为0.15%,这几乎是相同的

    #########

    del_之后为真del_之后为假n_之后为20000000

    跑前

    成员百分比0.15%

    ------完成------qsize 20000000

    成员百分比37.61%

    在puts之后删除队列

    成员百分比0.16%

    可以看出,只有在第二种情况下,当仅调用
    queue.put()
    时,内存才会返回到起始级别,因此似乎
    queue.get()
    会产生内存泄漏

    这在python 3.7、3.8和3.9中都是持久的

    我试着用tracemalloc和Pypler分析内存,但是它们在python级别上没有显示任何泄漏,所以我怀疑这可能是C级别的泄漏

    我在应用程序上使用带有线程的队列进行日志记录,这些应用程序被支持运行数周,而队列似乎会导致泄漏并挂起我的应用程序。我可以在那里跟踪泄漏,它们表明这似乎来自队列机制中使用的条件锁中的deque,但我从未见过在我运行的应用程序中充满任何元素/等待者,所以请仔细想想

    threading.py:348:
    waiters_to_notify = _deque(_islice(all_waiters, n))
    
    在任何情况下,是否有办法缓解和处理此队列泄漏?
    谢谢

    如果有人在寻找解决方案,那么泄漏的原因似乎是队列实现中使用的库存python deque。我已将deque实现从这里找到的stock实现更改为:

    然后重新定义队列类,如下所示:

    from cllist import dllist
    
    class DllistQueue(queue.Queue):
        def _init(self, maxsize):
            self.queue = dllist()
    
    然后,新类的结果为:

    #########

    del_在_之后放假del_在_变成真后n_放20000000

    跑前

    成员百分比0.15%

    正在放置0 qsize 0

    ------完成------qsize 20000000

    成员百分比47.35%

    ------完成------qsize 0

    成员百分比0.16%

    获取后删除队列

    成员百分比0.16%

    所以这个链接列表的实现似乎没有泄漏,而且它和股票一样快。唯一的缺点是它在最高使用率时使用了更多的内存

    from cllist import dllist
    
    class DllistQueue(queue.Queue):
        def _init(self, maxsize):
            self.queue = dllist()