2013-09-29 35 views
1

我有几个工作人员正在监听RabbitMQ队列,并且正在进行一些磁盘I/O密集型工作 - 打开〜18MB文件,执行一些解析并写入某些文件。处理一份工作时,工作人员可能需要高达200MB的内存......这很好。饥饿的Python工作者中的内存泄漏

但是,我的问题是,工作人员继续闲置,仍然保留这些内存。在作业完成后,我已经盲目尝试使用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这里发生的一切包含内存明智和一次删除我设置对象为无?我也尝试过使用Python的del语句,但没有任何改进。

我使用Python 2.7和python-pika与RabbitMQ服务器通信,如果有问题。

+0

您可以尝试使用[objgraph](http://mg.pov.lt/objgraph/)找出哪些对象占用此空间。 – fjarri

+0

看到这个http://stackoverflow.com/questions/11957539/python-memory-not-being-given-back-to-kernel –

回答

0

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

+0

我不明白这一点,我没有使用Python的任何异步框架..所以fp.execute_job()在下一行(fp = None)被执行之前完成了..所以我没有看到这将如何帮助.. – Niklas9

+0

尝试向工作人员传递虚拟作业,也许参考由工作人员保留本身并在开始新工作时发布。 – cox

+0

不,它不是不幸的,内存消耗与每个工作相同的数量增长:( – Niklas9