Python, counter atomic increment

前端 未结 3 1011
庸人自扰
庸人自扰 2020-12-13 09:04

How can I translate the following code from Java to Python?

AtomicInteger cont = new AtomicInteger(0);

int value = cont.getAndIncrement();
相关标签:
3条回答
  • 2020-12-13 09:14

    Most likely with an threading.Lock around any usage of that value. There's no atomic modification in Python unless you use pypy (if you do, have a look at __pypy__.thread.atomic in stm version).

    0 讨论(0)
  • 2020-12-13 09:14

    itertools.count returns an iterator which will perform the equivalent to getAndIncrement() on each iteration.

    Example:

    import itertools
    cont = itertools.count()
    value = next(cont)
    
    0 讨论(0)
  • 2020-12-13 09:38

    This will perform the same function, although its not lockless as the name 'AtomicInteger' would imply.

    Note other methods are also not strictly lockless -- they rely on the GIL and are not portable between python interpreters.

    class AtomicInteger():
        def __init__(self, value=0):
            self._value = int(value)
            self._lock = threading.Lock()
            
        def inc(self, d=1):
            with self._lock:
                self._value += int(d)
                return self._value
    
        def dec(self, d=1):
            return self.inc(-d)    
    
        @property
        def value(self):
            with self._lock:
                return self._value
    
        @value.setter
        def value(self, v):
            with self._lock:
                self._value = int(v)
                return self._value
    
    0 讨论(0)
提交回复
热议问题