背景
我计划使用 logging.handler.RotatingFileHandler
,并且我正在使用 multiprocessing
从多个进程进行日志记录。
我看到很多建议使用 multiprocessing.Queue
和一个监听器进程来序列化日志记录。
问题
相比使用 multiprocessing.Lock
包装日志函数,使用队列的优势是什么?似乎大部分(如果不是全部)建议都倾向于使用队列,但我还没有看到任何真正的解释。
我计划使用 logging.handler.RotatingFileHandler
,并且我正在使用 multiprocessing
从多个进程进行日志记录。
我看到很多建议使用 multiprocessing.Queue
和一个监听器进程来序列化日志记录。
相比使用 multiprocessing.Lock
包装日志函数,使用队列的优势是什么?似乎大部分(如果不是全部)建议都倾向于使用队列,但我还没有看到任何真正的解释。
使用队列的优点是可以实现进程日志调用的非阻塞。此外,队列(单个工作线程)保持日志消息在日志文件中的生成顺序。
如果要使用具有非阻塞行为的锁,必须以非阻塞模式获取锁。为此,每个子进程都必须通过缓冲日志消息来记录日志。这增加了不必要的复杂性,并可能导致在保存日志消息之前出现延迟,从而导致消息顺序错误。
如果要使用阻塞模式的锁,则在获取锁时子进程不需要本地队列。但是,这会阻塞代码执行。这通常是不希望发生的行为,因为期望日志记录非常快速。
multiprocessing.Lock()
来序列化对该文件的访问吗? - Alp