簡體   English   中英

信號處理程序和Python中的日志記錄

[英]Signal handlers and logging in Python

日志模塊的文檔說明了這一點

如果使用信號模塊實現異步信號處理程序,則可能無法在此類處理程序中使用日志記錄。 這是因為線程模塊中的鎖實現並不總是可重入的,因此不能從這樣的信號處理程序中調用。

這表明不應該直接或間接地從信號處理程序調用的代碼中進行日志記錄調用。 如果你偶爾執行一次程序,那么只剩下kill -9有幫助的狀態。

現在重要的問題是如下。 其他線程主線程處理信號調用日志記錄方法時,是否也會發生此鎖定問題?

信號處理程序在UNIX編程中需要特殊處理。 只有定義的POSIX C函數列表被聲明為可重入,並且可以在POSIX信號處理程序中調用。 IEEE Std 1003.1列出了您在https://www.opengroup.org/找到的118個可重入的UNIX函數(需要登錄)。

但Python信號是異步的: 信號模塊有一個澄清:

雖然就Python用戶而言,Python信號處理程序是異步調用的,但它們只能出現在Python解釋器的“原子”指令之間。 這意味着在純C中實現的長計算期間到達的信號(例如大文本上的正則表達式匹配)可能會延遲一段任意時間。

在這種情況下,Python中的信號被推遲,直到GIL 空閑

回到你的問題。 ,只要您在信號處理功能中使用重入功能。 如果僅在線程中使用日志記錄,則不會出現問題。

GIL(全局解釋器鎖)防止任何Python代碼同時運行,因此從技術上講,主線程在其他線程運行時無法處理信號。 它可能會“出現”,但有一個大的互斥鎖只允許一次運行一個python線程。

我能猜到的最好的是,信號和線程的問題在於信號通常是由中斷引起的,這種中斷可能隨時發生。 所以我想象Python會停止正在做的事情並調用處理程序。 此時可能已經獲取了鎖,因此如果日志記錄嘗試再次鎖定,則會出現死鎖。 在某些實現中,這可以正常工作,因為互斥鎖可以多次鎖定(重入),但其他鎖定只有一個鎖。

希望其他人可以支持這一點。

暫無
暫無

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

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