У меня есть класс, в котором есть словарь
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
И я запускаю 4 потока (по одному для каждого ресторана), которые вызывают этот метод OrderBook.addOrder
. Вот функция, выполняемая каждым потоком:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Это безопасно, или мне нужно использовать блокировку перед звонком addOrder
?
Ответы:
Встроенные структуры Python являются потокобезопасными для отдельных операций, но иногда бывает трудно понять, где оператор действительно превращается в несколько операций.
Ваш код должен быть в безопасности. Имейте в виду: замок здесь почти не добавит накладных расходов и даст вам душевное спокойствие.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm содержит более подробную информацию.
источник
Да, встроенные типы по своей сути являются потокобезопасными: http://docs.python.org/glossary.html#term-global-interpreter-lock
источник
Руководство по стилю Google не рекомендует полагаться на атомарность диктовки
Более подробно объясняется в: Является ли присвоение переменной Python атомарным?
И я согласен с этим: в CPython уже есть GIL, поэтому снижение производительности при использовании Lock будет незначительным. Гораздо дороже будут часы, потраченные на поиск ошибок в сложной кодовой базе, когда эти детали реализации CPython изменятся в один прекрасный день.
источник