Python多进程日志记录到共享文件

时间:2019-08-10 04:38:52

标签: python logging multiprocessing

我使用多处理框架创建了几个并行子进程(通过JoinableQueue),但是我只是在主线程中设置了日志记录(使用普通的python日志记录模块)。而且,当我测试代码时,似乎所有子流程都能够将其日志放入主流程开始时指定的单个日志文件中。

但是,根据python logging cookbook,它表示模块日志记录仅是线程安全的,而不是进程安全的。建议使用:

  1. multiprocessing.logging(不具有以下全部功能 记录);
  2. 使用mutliprocessing.Lock将接线序列化为 子流程的日志文件
  3. 使用logging.QueueHandler将日志发送到 一个multiprocessing.Queue,然后在其中有一个专用的日志记录线程 将日志记录写入日志文件的主要过程

所有建议的解决方案对我来说都是有意义的,并且我实际上能够实现解决方案#3-它起作用了,没有问题。

但是,我确实有一个问题,如果我们处理得不好,将会是什么问题。如果我不做#1,2,3中的任何一个(如我在第一段中所述),会发生什么不良后果?以及如何使这些不良后果发生(我很好奇看到它们)?

1 个答案:

答案 0 :(得分:1)

通常,您希望以某种方式将日志写入为atomic。也就是说,在这种情况下,当某人将一块文本写入日志时,该块会出现在一起,而不是被拆分并与其他日志条目的内容混合在一起。如果多个进程尝试在不进行某种调解的情况下写入文件,则可能导致内容的这种混合甚至破坏。

为有意造成这种情况,请有多个进程在不进行调解的情况下重复且同时写入日志(没有锁或处理进程),就像文档中建议的那样。进程越多,写的时间越长(部分取决于缓冲区的大小),则混合的可能性就越大。