Mam klasę, która zawiera słownik
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Uruchamiam 4 wątki (po jednym dla każdej restauracji), które wywołują metodę OrderBook.addOrder
. Oto funkcja uruchamiana przez każdy wątek:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Czy to jest bezpieczne, czy muszę użyć zamka przed zadzwonieniem addOrder
?
Odpowiedzi:
Wbudowane struktury Pythona są bezpieczne dla wątków dla pojedynczych operacji, ale czasami może być trudno zobaczyć, gdzie instrukcja naprawdę staje się operacją wielokrotną.
Twój kod powinien być bezpieczny. Pamiętaj: zamek w tym miejscu prawie nie zwiększy kosztów i zapewni ci spokój.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm zawiera więcej szczegółów.
źródło
Tak, wbudowane typy są z natury bezpieczne dla wątków: http://docs.python.org/glossary.html#term-global-interpreter-lock
źródło
Przewodnik stylistyczny Google odradza poleganie na atomowości dyktowania
Bardziej szczegółowo wyjaśniono w: Czy przypisanie zmiennych w Pythonie jest atomowe?
I zgadzam się z tym: w CPythonie jest już GIL, więc wydajność korzystania z Locka będzie znikoma. O wiele bardziej kosztowne będą godziny spędzone na poszukiwaniu błędów w złożonej bazie kodów, gdy te szczegóły implementacji CPythona zmienią się pewnego dnia.
źródło