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
變量的類裏面或外面,我的假設是,這被視爲同一個全局鎖?它是否正確?
壞主意的子類鎖混淆。 – Chameleon
你能詳細說一下嗎? –
是的,我將詳細說明: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