Python多进程记录到共享文件

Posted

技术标签:

【中文标题】Python多进程记录到共享文件【英文标题】:Python multiple process logging to a shared file 【发布时间】:2019-12-17 17:52:39 【问题描述】:

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

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

    multiprocessing.logging(不具备 记录); 使用 mutliprocessing.Lock 将接线序列化到 来自子进程的日志文件 使用 logging.QueueHandler 将日志发送到 一个 multiprocessing.Queue,然后有一个专用的日志记录线程 处理将日志记录写入日志文件的主要过程

所有建议的解决方案对我来说都很有意义,而且我实际上能够实施解决方案 #3 - 它有效,没有问题。

但是,我确实有一个问题,如果我们处理不好会出现什么问题。如果我没有执行 #1,2,3 中的任何一项(如我在第一段中所述),可能会发生什么不良后果?我怎样才能让这些不良后果发生(我很想看到它们)?

【问题讨论】:

【参考方案1】:

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

为了故意造成这样的事情,让多个进程在没有中介的情况下重复并同时写入日志(没有锁定或处理进程),正如文档所建议的那样,您不应该这样做。写入的进程越多,写入的时间越长(部分取决于缓冲区大小),您就越有可能发生混合。

【讨论】:

谢谢 (+1) @Ouroboros,所以当您说混合时,您的意思是以下吗?假设子进程 A 正在将“AAAAA”写入日志文件,而子进程 B 正在写入“BBBBB”;如果有控制,我们可能会得到一个内容为“ABABBABBAA”的日志文件? @YujieZha 是的,但是由于缓冲,块往往更大。

以上是关于Python多进程记录到共享文件的主要内容,如果未能解决你的问题,请参考以下文章

033 Android多进程-共享内存

python学习笔记——多进程中共享内存Value & Array

python中各模块变量共享的问题。

进程和共享文件描述符

在 python 多处理中传递共享内存变量

互斥锁,IPC队列