2013-05-28 73 views
8

我正在考慮使用類變量作爲線程鎖,因爲我不喜歡在全局變量中定義一個鎖並且還想防止死鎖。這實際上工作嗎?例如:Python:我可以使用類變量作爲線程鎖嗎?

import threading 

class A(object): 
    lock = threading.Lock() 
    a = 1 

    @classmethod 
    def increase_a(cls): 
     with cls.lock: 
      cls.a += 1 

考慮,我不會的地方重新分配A.lock變量的類裏面或外面,我的假設是,這被視爲同一個全局鎖?它是否正確?

+0

壞主意的子類鎖混淆。 – Chameleon

+0

你能詳細說一下嗎? –

+0

是的,我將詳細說明:A.lock由A元類初始化(作爲默認類型) - 從A繼承的所有類將共享同一個鎖,所以B類(A):pass是A.lock == B.如果'B'將使用'A.increase',它會導致鎖定,因爲double'A.lock.aquire(); B.lock.aquire()#死鎖A.lock是B.lock'。有效模式是用類初始化鎖代替元類(defualt類型),這將允許線程安全繼承。不要嘗試在這種情況下使用RLock,因爲它會導致更復雜的錯誤。 – Chameleon

回答

2

當然。你想有一個容易獲得的鎖的引用,並且將它存儲在類上就好了。

您可能需要調用它__lock(激活name mangling)雖然,所以它不是在使用它,因爲繼承問題的

相關問題