Created
August 3, 2016 13:12
-
-
Save benhoyt/8c8a8d62debe8e5aa5340373f9c509c7 to your computer and use it in GitHub Desktop.
An atomic, thread-safe incrementing counter for Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""An atomic, thread-safe incrementing counter.""" | |
import threading | |
class AtomicCounter: | |
"""An atomic, thread-safe incrementing counter. | |
>>> counter = AtomicCounter() | |
>>> counter.increment() | |
1 | |
>>> counter.increment(4) | |
5 | |
>>> counter = AtomicCounter(42.5) | |
>>> counter.value | |
42.5 | |
>>> counter.increment(0.5) | |
43.0 | |
>>> counter = AtomicCounter() | |
>>> def incrementor(): | |
... for i in range(100000): | |
... counter.increment() | |
>>> threads = [] | |
>>> for i in range(4): | |
... thread = threading.Thread(target=incrementor) | |
... thread.start() | |
... threads.append(thread) | |
>>> for thread in threads: | |
... thread.join() | |
>>> counter.value | |
400000 | |
""" | |
def __init__(self, initial=0): | |
"""Initialize a new atomic counter to given initial value (default 0).""" | |
self.value = initial | |
self._lock = threading.Lock() | |
def increment(self, num=1): | |
"""Atomically increment the counter by num (default 1) and return the | |
new value. | |
""" | |
with self._lock: | |
self.value += num | |
return self.value | |
if __name__ == '__main__': | |
import doctest | |
doctest.testmod() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you!