29a.ch

Atomic get and increment in python

written by Jonas Wagner, on 2/21/09 12:19 AM.

For generating continuous unique id's in python I needed a thread safe way to do this:
x = counter
counter += 1
When disassembling this code we will get this:
  2           0 LOAD_FAST                0 (counter)
              3 STORE_FAST               1 (x)

  3           6 LOAD_FAST                0 (counter)
              9 LOAD_CONST               1 (1)
             12 INPLACE_ADD         
             13 STORE_FAST               0 (counter)
As you can see not even counter += 1 is atomic. Now the obvious solution would be to use a lock. The not so obvious solution is to use a itertools.counter(). The counter is implemented in C and doesn't release the GIL so it is atomic. The code would the look like this:
x = counter.next()
which is more pretty anyway.

Leave a Reply

Author

Jonas Wagner Jonas Wagner
Software Engineer
Zürich, Switzerland

More about me

Follow 29a_ch on Twitter

Experiments

screenshot screenshot screenshot screenshot

More Experiments

Latest Posts Tags Archive Links

guitarmasterclass.net (guitar lessons)