【问题标题】:Python: Can I use class variables as thread locks?Python:我可以使用类变量作为线程锁吗?
【发布时间】: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


【解决方案1】:

当然。你想要一个容易获得的锁的引用,并将它存储在类中就可以了。

你可能想调用它__lock(激活name mangling),所以它不会与 A 的子类中的锁混淆

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2021-07-05
    • 2011-10-14
    • 2019-02-14
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多