多进程日志记录:锁定 vs 队列

4

背景

我计划使用 logging.handler.RotatingFileHandler,并且我正在使用 multiprocessing 从多个进程进行日志记录。

我看到很多建议使用 multiprocessing.Queue 和一个监听器进程来序列化日志记录。

问题

相比使用 multiprocessing.Lock 包装日志函数,使用队列的优势是什么?似乎大部分(如果不是全部)建议都倾向于使用队列,但我还没有看到任何真正的解释。


你的备选方案有点不太清晰。你是想让多个进程并发地写入同一个日志文件,并使用 multiprocessing.Lock() 来序列化对该文件的访问吗? - Alp
是的,那正是我的想法。 - user3246740
1个回答

2

队列

使用队列的优点是可以实现进程日志调用的非阻塞。此外,队列(单个工作线程)保持日志消息在日志文件中的生成顺序。


非阻塞锁

如果要使用具有非阻塞行为的锁,必须以非阻塞模式获取锁。为此,每个子进程都必须通过缓冲日志消息来记录日志。这增加了不必要的复杂性,并可能导致在保存日志消息之前出现延迟,从而导致消息顺序错误。

阻塞锁

如果要使用阻塞模式的锁,则在获取锁时子进程不需要本地队列。但是,这会阻塞代码执行。这通常是不希望发生的行为,因为期望日志记录非常快速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接