【问题标题】:Memory-leaks in hungry Python worker饥饿的 Python 工作者中的内存泄漏
【发布时间】:2013-10-05 06:49:27
【问题描述】:

我有一些工作人员正在侦听 RabbitMQ 队列,并且正在执行一些磁盘 I/O 密集型工作 - 打开约 18MB 的文件,进行一些解析并写入一些文件。在处理一项工作时,工人可能会占用多达 200MB 的内存。这很好。

但是,我的问题是工作人员继续处于空闲状态并仍在保留这么多的内存。在工作完成后,我盲目地尝试使用 gc.collect() 手动进行一些垃圾收集,但没有任何结果。

我的接受工作的工人阶级如下所示:

class BuildWorker(worker.Worker):

    def callback(self, ch, method, properties, body):
        fp = FileParseAndStuff()
        fp.execute_job(ch, method, properties, body)
        fp = None

不应该在 fp 中发生的所有事情都被包含在内存中并且一旦我将该对象设置为 None 就被删除吗?我也尝试过使用 Python 的 del 语句,但没有任何改进。

我正在使用 Python 2.7 和 python-pika 与 RabbitMQ 服务器通信,如果这很重要的话。

【问题讨论】:

  • 你可以尝试找出哪些对象占用了这个空间,使用objgraph。
  • 我遇到了同样的问题(尽管使用 Python 3.6)。我认为我的工作人员正在关闭一切,通道、数据库连接等。但随着时间的推移,系统内存不足。
  • 问题可能出在 FileParseAndStuff 但没有代码没人能说

标签: python memory-leaks garbage-collection rabbitmq


【解决方案1】:

在fp = None 之前放置一个标志,例如写入文件“完成”或打印到控制台。当您调用 del 或 gc.collect() 时,您的工作人员可能还不在那里。如果是,请检查您的 execute_job 方法。

【讨论】:

  • 我不明白,我没有使用 Python 的任何异步框架.. 所以 fp.execute_job() 在下一行 (fp = None) 执行之前完成.. 所以我不明白这有什么帮助..
  • 尝试将一个虚拟工作传递给工人,可能参考由工人自己保留并在开始新工作时释放。
  • 不,不幸的是,每个作业的内存消耗量都在增长:(
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2011-12-13
  • 2014-02-26
  • 2010-11-27
相关资源
最近更新 更多