Как я могу перевести следующий код из Java в Python?
AtomicInteger cont = new AtomicInteger(0);
int value = cont.getAndIncrement();
Ответ 1
Скорее всего, с threading.Lock вокруг любого использования этого значения. В Python нет атомной модификации, если вы не используете pypy (если вы это делаете, посмотрите __pypy__.thread.atomic в версии stm).
Ответ 2
itertools.count возвращает итератор, который будет выполнять эквивалент getAndIncrement() на каждой итерации.
Пример:
import itertools
cont = itertools.count()
value = cont.next()
Ответ 3
Это будет выполнять ту же функцию, хотя она не блокируется и подразумевается имя AtomicInteger.
Обратите внимание, что другие методы также не являются полностью безблокировочными - они полагаются на GIL и не переносимы между интерпретаторами python.
class AtomicInteger():
def __init__(self, value=0):
self._value = value
self._lock = threading.Lock()
def inc(self):
with self._lock:
self._value += 1
return self._value
def dec(self):
with self._lock:
self._value -= 1
return self._value
@property
def value(self):
with self._lock:
return self._value
@value.setter
def value(self, v):
with self._lock:
self._value = v
return self._value