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
beA.lock==B.lock
如果B
将使用A.increase
它将导致锁定,因为doubleA.lock.aquire();B.lock.aquire()#死锁A.lock是B.lock
。有效的模式是用类初始化锁替换元类(defualt类型),这将允许线程安全继承。不要尝试在这种情况下使用RLock,因为它会导致更复杂的错误。稍后阅读答案和注释好的,明白了。在这个特定的用例中,我并不打算继承这个类。不过这是一个很有用的提示。