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