2013-05-28 42 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)虽然,所以它不是在使用它,因为继承问题的

相关问题