如何在多进程中保护日志对象不被垃圾回收?

1 投票
3 回答
666 浏览
提问于 2025-04-16 07:49

我用Python的多进程模块创建了几个工作进程。在每个工作进程里,我使用标准的日志模块(带有日志轮换和每个工作进程一个日志文件)来监控工作进程的情况。我发现过了几个小时后,日志里就不再写入任何事件了。这个进程看起来没有崩溃,仍然能通过我的队列响应命令。通过使用lsof命令,我发现日志文件不再被打开。我怀疑日志对象可能被垃圾回收机制给清理掉了,如果真是这样,有没有办法让我标记它,以保护它不被清理呢?

3 个回答

0
http://docs.python.org/reference/datamodel.html#object.__del__

根据这个文档,当对象被销毁时,会调用del()方法。在这个时候,你可以创建一个对这个对象的引用,这样就可以防止它被回收。我不太确定怎么做,希望这能给你一些启发。

0

你可以在调用 fork() 之后立刻运行 gc.collect(),看看这样是否能让日志关闭。不过,垃圾回收通常不会在几小时后才生效,所以这个方法可能不太靠谱。

1

我同意@THC4k的看法。这看起来不像是垃圾回收的问题。我来告诉你我的理由,如果我错了,肯定会有人给我投反对票(如果真是这样,请留言告诉我哪里错了!)。

如果你在用CPython,它主要是通过引用计数来管理内存的。当一个对象的引用计数变为零时,它会立即被销毁(从2.0版本开始,还增加了额外的垃圾回收机制来处理循环引用的情况)。只要你保持对你的日志对象的引用,它就不会被销毁。

如果你在用Jython或IronPython,那么底层的虚拟机会负责垃圾回收。同样,只要保持一个引用,垃圾回收就不会去碰它。

无论如何,看来你要么没有保持对一个需要存活的对象的引用,要么是其他地方出了问题。

撰写回答