【发布时间】:2013-05-23 05:07:05
【问题描述】:
我正在考虑使用类变量作为线程锁,因为我不喜欢在全局变量中定义锁并且也想防止死锁。这真的有效吗?示例:
import threading
class A(object):
lock = threading.Lock()
a = 1
@classmethod
def increase_a(cls):
with cls.lock:
cls.a += 1
考虑到我不会在类内部或外部的某处重新分配A.lock 变量,我的假设是它被视为与全局锁相同?这是正确的吗?
【问题讨论】:
-
由于继承问题而使用它是个坏主意。
-
是的,我会详细说明:A.lock 由 A 元类初始化(作为默认类型) - 从 A 继承的所有类都将共享相同的锁,所以
class B(A): pass是A.lock == B.lock如果B将使用A.increase它将导致锁定,因为双A.lock.aquire(); B.lock.aquire() # deadlock A.lock is B.lock。有效的模式是用类初始化锁替换元类(默认类型),这将允许线程安全继承。在这种情况下不要尝试使用 RLock,因为它会导致更复杂的错误。 -
稍后阅读答案和cmets stackoverflow.com/questions/23196437
-
好的,知道了。在这个特定的用例中,我不打算从这个类继承。不过,这是一个非常有用的提示。
标签: python multithreading locks