LINUX.ORG.RU

[Python] А операции изменения списков и словарей (с учетом GIL) атомарны?

 


0

1

Сходу как то нигде не нашел... С-но интересует 2й python, ну и многонитевые приложения;-))))

Судя по тому, что для большинства (насчет всех не уверен) таких операций есть ф-и в PyAPI ответ должен бы быть да? Но с другой стороны, может и не для всех (типа какой нить += для списка?), и потом я все же лучше переспрошу у Вселенского Разума - уж больно феерический результат выдаст приложение если ошибаюсь....

И да, как быть с операциями изменения глобальных переменных?

★★★★★
Ответ на: комментарий от tensai_cirno

И? Вот у меня есть глобальный словарь D, глобальный список L и глобальный счетчик counter. С ними работает несколько потоков. Понятно, что при нормальной многопоточности даже изменение counter-а неатомарно и надо обвешивать его блокировками.

А что в питон? Если единовременной выполняется только один поток, и операция чтения/изменения объекта занимает не больше одной инструкции байт-кода (те в середине операции не может произойти переключение потоков), то получается что в этому случае блокировки не нужны?

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Я про то что GIL к этому не имеет отношения. И там вроде зеленые треды, диспетчеризацией и переключением контекстов занимается интерпретатор. Вообще тебе нужен кто-нибудь другой, я на питоне не пишу :-)

tensai_cirno ★★★★★
()
Ответ на: комментарий от tensai_cirno

> Вообще тебе нужен кто-нибудь другой, я на питоне не пишу :-)

С этого надо было начинать!;-)))) Эй, есть кто другой??? ;-)))

AIv ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

Насколько я помню, отвественность за то, что единовременно работает только один поток лежит именно на GIL, и атомарность есть тогда прямое следствие.

AIv ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

Я? Нет, МЫ! (вместе Д.Мертцем, хотя конечно чего он понимает в колбасных обрезках...)

«В этом вся загвоздка: в любой момент может выполняться только один поток Python. Глобальная блокировка интерпретатора — GIL — тщательно контролирует выполнение тредов. GIL гарантирует каждому потоку эксклюзивный доступ к переменным интерпретатора (и соответствующие вызовы C-расширений работают правильно).»

http://habrahabr.ru/blogs/python/84629/

AIv ★★★★★
() автор топика

типа какой нить += для списка?

AFAIK нет. Доступ к элементу, запись элемента да, но между этими операциями может переключиться контекст.

baverman ★★★
()
Ответ на: комментарий от baverman

Вроде как += для списка перегруженный оператор, модифицирующий сам список (правда я встречал и другое поведение). Но для int очевидно нет?

В общем я к чему - как то раньше заморачивался и ставил блокировки и на такие вещи. Сейчас подумал - а -сно зачем? Нормальную многопоточность допилят еще нескоро (если допилят)...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Вот сравнение += и extend для списков. Судя по опкоду эти операции укладываются в один тик. Поэтому потокобезопасны.

>>> def aaa():
...     a = []
...     b = [1,2,3]
...     a.extend(b)
...     return a
...     
... 
>>> dis.dis(aaa)
  3           0 BUILD_LIST               0
              3 STORE_FAST               0 (a)

  4           6 LOAD_CONST               1 (1)
              9 LOAD_CONST               2 (2)
             12 LOAD_CONST               3 (3)
             15 BUILD_LIST               3
             18 STORE_FAST               1 (b)

  5          21 LOAD_FAST                0 (a)
             24 LOAD_ATTR                0 (extend)
             27 LOAD_FAST                1 (b)
             30 CALL_FUNCTION            1
             33 POP_TOP             

  6          34 LOAD_FAST                0 (a)
             37 RETURN_VALUE        
>>> def bbb():
...     a = []
...     b = [1,2,3]
...     a += b
...     return a
...     
... 
>>> dis.dis(bbb)
  3           0 BUILD_LIST               0
              3 STORE_FAST               0 (a)

  4           6 LOAD_CONST               1 (1)
              9 LOAD_CONST               2 (2)
             12 LOAD_CONST               3 (3)
             15 BUILD_LIST               3
             18 STORE_FAST               1 (b)

  5          21 LOAD_FAST                0 (a)
             24 LOAD_FAST                1 (b)
             27 INPLACE_ADD         
             28 STORE_FAST               0 (a)

  6          31 LOAD_FAST                0 (a)
             34 RETURN_VALUE
baverman ★★★
()
Ответ на: комментарий от baverman

Да, я разобрался - были просто кривые руки;-)

Ок, спасибо!

AIv ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

> Интерпретатор встает в блок при сисколлах.

нет.

anonymous
()
Ответ на: комментарий от tailgunner

Мм, встает в блок при любых синхронных действиях?

tensai_cirno ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.