2013-07-26 3 views
3

Является ли операция вроде x,y = self.mytuple атомарной в Python?Действительно ли Python распаковывает потоки?

Или может self.mytuple быть изменен другим потоком во время назначения, что приведет к х, относящемуся к первой версии self.mytuple, и y ко второй версии?

Я использую Python 3.

+1

Правило большого пальца: * Ничто * не является потокобезопасным, за исключением блокировки одного из встроенных замков (т. Е. Если вам нужна безопасность потока, заблокируйте себя). Это правило имеет преимущество в том, чтобы оставаться верным в других реализациях Python (и других версиях тех, которые вы знаете), и когда утиная печать приводит к тому, что пользовательский класс используется там, где вы ожидаете встроенный. – delnan

ответ

5

Это поточно-только если доступ пункт не обрабатывается код Python.

Распаковка обрабатывается одним байткод:

>>> 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   

условии self.mytuple действительно стандартный Python tuple, то есть поточно.

Как только доступ к предметам из mytuple запускает обычай __getitem__, все ставки отключены.

+0

Тогда это будет потокобезопасным, так как распаковка последовательности должна выполняться локально. (x и y также являются локальными переменными в моем примере) –

+0

@JohnSmithOptional: действительно, неправильно понят, где OP нуждался в безопасности потоков. Скорректированная. –

+0

Спасибо. Я также прочитал ваш ответ здесь: http://stackoverflow.com/questions/13649684/is-sequence-unpacking-atomic, который разъяснил это для меня. –

Смежные вопросы