Python的日志记录模块线程安全吗?

Rhu*_*arb 34 python

如果从两个不同的python线程调用相同的日志记录处理程序,是否需要锁定?

unu*_*tbu 40

记录模块是线程安全的; 它为您处理锁定.查看文档.

  • 该错误是在谈论“ fork”,它涉及进程而不是线程。所以我猜线程安全语句仍然存在吗? (3认同)

小智 5

如果从不同线程调用相同的处理程序,则它是线程安全的。我将针对这个问题稍微扩展一下。事实上,这取决于你如何使用该logging模块。多线程登录时仍然存在一些非线程安全的情况。

如果多个线程使用不同的记录器实例(例如,logging.getLogger()在每个线程中调用不同的名称),并且这些记录器实例拥有自己的FileHandler 指向同一文件的实例,则会导致竞争条件,从而不再是线程安全的。

此外,如果不同线程中的多个记录器实例持有自己的RotatingFileHandlerTimedRotatingFileHandler,当它们指向同一文件时(即,在实例化它们时给出相同的文件名),它们旋转文件的逻辑也不是线程安全的。当他们需要旋转文件时,可能会发生奇怪的事情。(您可以参考问题Python TimedRotatingFileHandler - messages is Missing,这是由类似的原因引起的)

在模块中,logging每个处理程序实例都持有一个threading.RLock实例,因此持有不同处理程序的不同记录器将持有不同的RLocks,因此当记录器尝试在不同线程中写入同一文件时,这些锁无法避免竞争条件 - 记录器即使他们已经获得了自己的RLock.

您可以参考Logging Cookbook - Opening the same log file multiple times部分以获取更多信息。