Подтвердить что ты не робот

Python, счетчик атомного приращения

Как я могу перевести следующий код из Java в Python?

AtomicInteger cont = new AtomicInteger(0);

int value = cont.getAndIncrement();
4b9b3361

Ответ 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