Потокобезопасность в словаре Python


у меня есть класс, который содержит словарь

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?

2 70

2 ответа:

встроенные структуры 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

Это упрощает реализацию CPython, делая объектную модель ( включая критические встроенные типы, такие как dict) неявно защищены от параллельного доступа.