Python:我可以使用类变量作为线程锁吗?

Python:我可以使用类变量作为线程锁吗?,python,multithreading,locks,Python,Multithreading,Locks,我正在考虑使用一个类变量作为线程锁,因为我不喜欢在全局变量中定义锁,也希望防止死锁。这真的有效吗?例如: import threading class A(object): lock = threading.Lock() a = 1 @classmethod def increase_a(cls): with cls.lock: cls.a += 1 考虑到我不会将A.lock变量重新分配到类内部或外部的某个地方,我的

我正在考虑使用一个类变量作为线程锁,因为我不喜欢在全局变量中定义锁,也希望防止死锁。这真的有效吗?例如:

import threading

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

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

考虑到我不会将
A.lock
变量重新分配到类内部或外部的某个地方,我的假设是它被视为与全局锁相同?这是正确的吗?

当然。您希望有一个易于获取的锁引用,并将其存储在类中就可以了


不过,您可能想将其称为
\uu lock
(激活),这样就不会与A的子类中的锁混淆,因为继承有问题,所以使用它是个坏主意。是的,我将详细说明:A.lock由元类初始化(作为默认类型)-从A继承的所有类都将共享同一个锁,因此
类B(A):pass
be
A.lock==B.lock
如果
B
将使用
A.increase
它将导致锁定,因为double
A.lock.aquire();B.lock.aquire()#死锁A.lock是B.lock
。有效的模式是用类初始化锁替换元类(defualt类型),这将允许线程安全继承。不要尝试在这种情况下使用RLock,因为它会导致更复杂的错误。稍后阅读答案和注释好的,明白了。在这个特定的用例中,我并不打算继承这个类。不过这是一个很有用的提示。