Руководство по стилю Google советует против него
Я не утверждаю, что руководства по стилю Google - это абсолютная истина, но обоснование в разделе «Потоки» дает некоторое представление (выделение мое):
Не полагайтесь на атомарность встроенных типов.
Хотя во встроенных типах данных Python, таких как словари, кажется, есть атомарные операции, существуют угловые случаи, когда они не атомарны (например, если __hash__
или __eq__
реализованы как методы Python) и их атомарность не должна полагаться. Также не следует полагаться на назначение атомарных переменных (поскольку это, в свою очередь, зависит от словарей).
Используйте тип данных Queue модуля Queue
в качестве предпочтительного способа передачи данных между потоками. В противном случае используйте модуль потоков и его блокирующие примитивы. Узнайте о правильном использовании условных переменных, чтобы вы могли использовать threading.Condition
вместо блокировок более низкого уровня.
Итак, моя интерпретация заключается в том, что в Python все похоже на dict, и когда вы делаете a = b
в бэкэнде, где-то происходит globals['a'] = b
, что плохо, так как dicts не обязательно являются потокобезопасными.
Для одной переменной Queue
не идеален, поскольку мы хотим, чтобы он содержал только один элемент, и я не смог найти идеальный ранее существующий контейнер в stdlib, который автоматически синхронизирует метод .set()
. Так что сейчас я делаю только:
import threading
myvar = 0
myvar_lock = threading.Lock()
with myvar_lock:
myvar = 1
with myvar_lock:
myvar = 2
Интересно, что Мартелли, похоже, не против рекомендации по стилю Google :-) (он работает в Google)
Интересно, имеет ли значение CPYthon GIL этот вопрос: Что такое глобальная блокировка интерпретатора (GIL) в CPython?
Эта ветка также предполагает, что CPython-дикты являются поточно-ориентированными, включая следующую глоссарийную цитату, в которой явно упоминается https://docs.python.org/3/glossary.html#term-global-interpreter-lock
Это упрощает реализацию CPython, делая объектную модель (включая критические встроенные типы, такие как dict) неявно защищенной от одновременного доступа.