аннотация метода блокировки питона

Существует ли аннотация, связанная с блокировкой python, которая имеет такой же эффект для метода python, что и «синхронизированное» ключевое слово для java-методов?

2 Solutions collect form web for “аннотация метода блокировки питона”

Я могу предположить, что в python нет встроенной функции, но вы можете реализовать ее, понимая, как она работает в Java по этой ссылке:

Каждый созданный Java-объект, включая каждый загруженный класс, имеет связанную блокировку или монитор. Ввод кода внутри синхронизированного блока позволяет компилятору приложить команды для получения блокировки на указанном объекте перед выполнением кода и затем освободить его (либо потому, что код заканчивается нормально, либо ненормально). Между приобретением замка и его выпуском считается, что нить «владеет» блокировкой. В точке Thread A, желающей получить блокировку, если Thread B уже владеет ею, то Thread A должен дождаться, когда Thread B отпустит ее.

так что, возможно, что-то вроде этого может работать:

синхронизированный оператор в java:

public class Java { static private int count = 0; public void increment() { synchronized (this) { count++; } } } 

стал:

 import threading class Java: cout = 0 lock = threading.RLock() def increment(): with Java.lock: Java.cout += 1 

и синхронизированный метод в Java:

 public class Java { static private int count = 0; public synchronized void increment() { count ++; } } 

стали:

 import threading def synchronized(method): """ Work with instance method only !!! """ def new_method(self, *arg, **kws): with self.lock: return method(self, *arg, **kws) return new_method class Java: count = 0 lock = threading.RLock() @synchronized def incremenet(self): Java.count += 1 

Явный лучше, чем неявный.

NB: мои знания на Java очень ограничены, и это моя первая лекция об этой Java-функции, поэтому, возможно, я что-то пропустил (или, может быть, я пропустил все здесь :)), надеюсь, что этот ответ может кому-то помочь.

NB: блокировка, которую я создал, представляет собой переменную класса, поэтому синхронизация потоков выполняется на уровне класса, если мы хотим сделать синхронизацию на уровне экземпляра (только), которая, как мне кажется, соответствует тому, как это делает Java, приведенный выше код должен измениться.

Иногда я использую такой декоратор:

 def synchronized(f): @functools.wraps(f) def wrapper(self, *args, **kwargs): try: _ = self._lock except AttributeError: self._lock = threading.Lock() with self._lock: return f(self, *args, **kwargs) return wrapper 

Тем не менее, это решение имеет условие гонки при вызове декорированного метода. Самый простой способ избежать этой проблемы – вызвать один синхронизированный метод, когда ни один другой self._lock не запускается первым, или назначить self._lock вручную в __init__

  • Как предотвратить переписывание объекта кто-то еще изменил
  • Python 3.2 - GIL - хороший / плохой?
  • Почему Python предоставляет механизмы блокировки, если он подлежит GIL?
  • Неблокирующий метод для разбора (потоковой передачи) XML в python
  • Python - лучший язык программирования в мире.