Is Python unpacking thread safe?

atomic, multithreading, python, thread-safety

Solution

It is thread-safe only if item access is not handled by Python code.

The unpacking is handled by one bytecode:

>>> def f():
...     a, b = self.mytuple
... 
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (self) 
              3 LOAD_ATTR                1 (mytuple) 
              6 UNPACK_SEQUENCE          2 
              9 STORE_FAST               0 (a) 
             12 STORE_FAST               1 (b) 
             15 LOAD_CONST               0 (None) 
             18 RETURN_VALUE         

Provided `self.mytuple` is really a standard Python `tuple`, that is threadsafe.

As soon as accessing items from `mytuple` triggers a custom `__getitem__`, all bets are off.

Problem

Is an operation like `x,y = self.mytuple` atomic in Python ? Or could `self.mytuple` be modified by another thread during the assignment, leading to x refering to the first version of self.mytuple, and y to the second version? I'm using Python 3.

Original source

Related problems