我使用Python的Multiprocessing模块2.6创建了几个工作进程。 在每个工作者中,我使用标准日志记录模块(具有日志轮换和每个工作者的文件) 密切关注工人。我注意到经过几个小时后就没有了 事件被写入日志。该过程似乎没有崩溃并仍然响应 通过我的队列命令。使用lsof我可以看到日志文件不再打开。 我怀疑垃圾收集器可能会杀死日志对象,如果是这样的话 我可以标记它来保护它吗?
答案 0 :(得分:1)
我同意@ THC4k。这似乎不是GC问题。我会告诉你我的原因,如果我错了,我肯定会有人投票给我(如果是的话,请留下评论指出我的错误!)。
如果您正在使用CPython,它主要使用引用计数,并且当引用计数变为零时立即销毁对象(从2.0开始,还提供补充垃圾收集以处理循环引用的情况)。保留对日志对象的引用,它不会被销毁。
如果您正在使用Jython或IronPython,则底层VM会执行垃圾回收。再次,保留一个参考,GC不应该触摸它。
无论哪种方式,似乎要么你没有保持对你需要保持活着的对象的引用,要么你还有其他错误。
答案 1 :(得分:0)
http://docs.python.org/reference/datamodel.html#object.__del__
根据此文档,在对象销毁时调用 del ()方法,此时您可以创建对该对象的引用以防止对其进行收集。我不知道该怎么做,希望这给你一些思考的食物。
答案 2 :(得分:0)
您可以在fork()之后立即运行gc.collect()
,看看是否会导致日志关闭。但是垃圾收集不可能只在几个小时后生效。