簡體   English   中英

Python 的日志記錄模塊線程安全嗎?

[英]Is Python's logging module thread safe?

如果從兩個不同的 python 線程調用相同的日志處理程序,是否需要鎖定?

日志模塊是線程安全的; 它為您處理鎖定。 請參閱文檔

如果你從不同的線程調用同一個處理程序,它是線程安全的。 對於這個問題,我將稍微擴展一下。 實際上,這取決於您如何使用logging模塊。 登錄多個線程時,仍然存在一些非線程安全的情況。

如果多個線程使用不同的記錄器實例(例如,在每個線程中調用不同名稱的logging.getLogger() ),並且這些記錄器實例有自己的FileHandler指向同一個文件,則會導致競爭條件,因此不會線程安全了。

此外,如果不同線程中的多個記錄器實例擁有自己的FileRotatingHandlerTimedRotatingFileHandler ,而它們指向同一個文件(即,在實例化它們時給出相同的文件名),它們旋轉文件的邏輯也不是線程安全的。 當他們需要旋轉文件時,可能會發生一些奇怪的事情。 (可以參考問題Python TimedRotatingFileHandler - logs are missing ,原因類似)

在后台,在logging模塊中,每個處理程序實例都持有一個threading.RLock實例,因此持有不同處理程序的不同記錄器將持有不同的RLock ,因此當記錄器嘗試寫入同一個文件時,這些鎖無法避免競爭條件不同的線程——記錄器仍然能夠同時將字節寫入同一個文件,即使他們已經獲得了自己的RLock

您可以參考日志記錄手冊 - 多次打開同一個日志文件部分以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM