[英]Is Python's logging module thread safe?
如果從兩個不同的 python 線程調用相同的日志處理程序,是否需要鎖定?
日志模塊是線程安全的; 它為您處理鎖定。 請參閱文檔。
如果你從不同的線程調用同一個處理程序,它是線程安全的。 對於這個問題,我將稍微擴展一下。 實際上,這取決於您如何使用logging
模塊。 登錄多個線程時,仍然存在一些非線程安全的情況。
如果多個線程使用不同的記錄器實例(例如,在每個線程中調用不同名稱的logging.getLogger()
),並且這些記錄器實例有自己的FileHandler
指向同一個文件,則會導致競爭條件,因此不會線程安全了。
此外,如果不同線程中的多個記錄器實例擁有自己的FileRotatingHandler
或TimedRotatingFileHandler
,而它們指向同一個文件(即,在實例化它們時給出相同的文件名),它們旋轉文件的邏輯也不是線程安全的。 當他們需要旋轉文件時,可能會發生一些奇怪的事情。 (可以參考問題Python TimedRotatingFileHandler - logs are missing ,原因類似)
在后台,在logging
模塊中,每個處理程序實例都持有一個threading.RLock
實例,因此持有不同處理程序的不同記錄器將持有不同的RLock
,因此當記錄器嘗試寫入同一個文件時,這些鎖無法避免競爭條件不同的線程——記錄器仍然能夠同時將字節寫入同一個文件,即使他們已經獲得了自己的RLock
。
您可以參考日志記錄手冊 - 多次打開同一個日志文件部分以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.