Я думал об использовании переменной класса в качестве блокировки потока, поскольку мне не нравится определять блокировку в глобальных переменных и также хочу предотвратить тупик. Это действительно работает? Пример:Python: Могу ли я использовать переменные класса в качестве блокировок потоков?
import threading
class A(object):
lock = threading.Lock()
a = 1
@classmethod
def increase_a(cls):
with cls.lock:
cls.a += 1
Учитывая я бы не переназначить переменную A.lock
где-то внутри или вне класса, мое предположение было бы, что она обрабатывается так же, как глобальный замок? Это верно?
плохая идея использовать его, так как проблемы наследования. – Chameleon
Можете ли вы уточнить? –
Да, я уточню: A.lock инициализируется метаклассом (как тип по умолчанию) - все классы, унаследованные от A, будут совместно использовать одну и ту же блокировку, поэтому 'class B (A): pass' be' A.lock == B. lock', если 'B' будет использовать' A.increase', это приведет к блокировке с двойного 'A.lock.aquire(); B.lock.aquire() # deadlock A.lock - B.lock'. Допустимый шаблон заменяет метаклас (defualt type) с блокировкой инициализации класса, что позволит потокобезопасное наследование. Не пытайтесь использовать в этом случае RLock, поскольку это приведет к более сложным ошибкам. – Chameleon