2010-09-01 52 views
3
>>> l = Lock() 
>>> l.acquire() 
True 
>>> l.release() 
>>> l.release() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: semaphore or lock released too many times 

引發ValueError異常。我怎樣才能防止多次釋放鎖?像l.is_released()?如何知道一個Python multiprocessing.Lock是否被釋放?

+1

通常情況下,您只需編寫自己的代碼,以便它不會嘗試釋放比獲取更多次數的鎖... – Amber 2010-09-01 15:39:05

+0

這可能包括使用標誌is_the_lock_locked? – 2010-09-03 11:49:32

回答

6

這個問題有點不清楚。您或者需要使用信號而不是鎖,或者檢查鎖是否鎖定。

例如,Python的鎖與.NET上的鎖不同。 Python的Lock一旦解鎖,釋放所有其他在同一個鎖上獲取()的線程,並暫時被阻塞。任何線程都可以釋放,並且可以同時進行。所以,不要做第二RELASE,做

if l.locked(): 
    l.release() 

如果你想「排隊」的行爲,其中只有一個胎面將獲得鎖的所有權,一旦其他一些版本中,使用信號量,事件或一些其他類似的類,允許嵌套鎖定和排隊行爲。

有趣的是,像.Net這樣的其他語言/ loolkits可以本地鎖定排隊,其中線程可以按順序堆積lock.acquire,按照獲取隊列的順序阻止並獲取鎖對象的所有權,而不是一次全部釋放。 (編輯:忘了把父母放在「if l.locked:l.realse()」中。更正了代碼.Lock.locked被證實是cPython 2.6.x,3.x中的一個存在方法, IronPython 2.6.1)

+7

>>>從多處理進口鎖 >>>鎖()鎖定 回溯(最近通話最後一個): 文件「」,1號線,在 AttributeError的:「鎖定」對象有沒有屬性「鎖定」 – 2010-09-03 11:44:26

+1

您可以執行非阻塞獲取,如在「not lock.acquire(False)」中檢查返回碼。 – kristopolous 2015-07-22 22:53:14

6

期望的是獲取鎖的上下文應該知道它何時應該釋放它。在什麼情況下你會嘗試多次釋放它?

+0

假設線程已經獲得了鎖,但是在執行工作時出現異常,我嘗試除了阻止,所以我想要檢查何時發生異常以獲取鎖,或者避免死鎖。 – 2012-02-29 18:52:21

+2

要麼讓你的嘗試更細化,要麼利用上下文管理器(使用my_lock :)來保證你的鎖的釋放。 。 – 2012-03-05 16:13:38

0

由於lock.acquire()在成功獲取鎖定時返回true,因此可以將鎖定狀態存儲在局部變量中,然後將lock.acquire()和隨後的代碼封裝到try - 最終阻止。然後在finally塊中,可以查詢變量以查看鎖是否已被獲取。如果有,釋放。

相關問題