2011-01-05 38 views
5

討論Signal handlers and logging in Python在我的腦海裏想到了哪些函數可重入Python的問題。Python中有哪些函數可重入信號庫處理

signal library提到:

雖然Python的信號處理程序 異步調用盡可能的 Python的用戶而言,他們可以只 了Python解釋器 的原子 指令之間發生。這意味着在長時間計算期間到達的信號 純粹以C實現(例如 正文表達匹配大 文本正文)可能會延遲任意時間量 。

這再入口不典型的被指出logging library

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

我有點困惑,因爲信號庫談論GIL(全局解釋器鎖)作爲「..原子指令之間......」。在這種情況下,一旦GIL離開/ 解鎖,信號被推遲並執行。一種信號隊列。

這很有道理,但是延遲信號處理程序調用的函數是否可重入是沒關係的,因爲它們不是在具有「重入」限制的POSIX信號處理程序中調用的:

只有POSIXç 功能的定義的列表被聲明爲重入 ,並且可以在POSIX 信號處理程序中被調用。 IEEE Std 1003.1列出了 118個重入UNIX函數,您會發現 處於https://www.opengroup.org/(需要登錄 )。

回答

2

我認爲是什麼使日誌模塊非重入的是,它採用了threading.Lock(而不是RLock)以多個線程登錄到相同的處理器(所以消息沒有得到交織的)同步。

這意味着,如果已經獲得鎖的通話記錄,通過信號處理程序中斷和信號處理程序試圖登錄它會永遠死鎖等待上acquire被釋放。

這些鎖與GIL無關,它們是「用戶創建」的鎖,可以用它來解釋,GIL是解釋器使用的鎖(實現細節)。

+0

我檢查了Python 2.7.1版本並且你的假設是錯誤的。檢查http://svn.python.org/view/python/tags/r271/Lib/logging/__init__.py?revision=86833&view=markup – 2011-01-05 14:07:39

+0

中的'_acquireLock()'函數我糾正了,它實際上是' RLock'。感謝您挖掘它。但是,根據文檔,實現可能並不總是可重入的:「這是因爲線程模塊中的鎖實現並不總是可重入的」(http://docs.python.org/library/logging.html #thread-safety) – albertov 2011-01-05 14:25:23

+0

這就是我在我的問題中提到的。我們可以總結一下,使用線程庫的每個模塊在用於* real * POSIX信號處理程序的意義上都是不可重入的。但是Python不推遲信號處理? – 2011-01-05 14:56:45