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

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

我收到工作的 worker 类看起来像这样:

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 服务器进行通信。

请您参考如下方法:

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!