Ich habe eine Klasse, die ein Wörterbuch enthält
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Und ich führe 4 Threads aus (einen für jedes Restaurant), die die Methode aufrufen OrderBook.addOrder
. Hier ist die Funktion, die von jedem Thread ausgeführt wird:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Ist das sicher oder muss ich vor dem Anruf ein Schloss benutzen addOrder
?
Antworten:
Die in Python integrierten Strukturen sind für einzelne Operationen threadsicher, aber manchmal ist es schwierig zu erkennen, wo eine Anweisung tatsächlich zu mehreren Operationen wird.
Ihr Code sollte sicher sein. Denken Sie daran: Eine Sperre hier verursacht fast keinen Overhead und gibt Ihnen Sicherheit.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm enthält weitere Details.
quelle
Ja, integrierte Typen sind von Natur aus threadsicher: http://docs.python.org/glossary.html#term-global-interpreter-lock
quelle
Der Styleguide von Google rät davon ab, sich auf diktierte Atomarität zu verlassen
Weitere Erläuterungen unter: Ist die Zuweisung von Python-Variablen atomar?
Und ich stimme diesem zu: Es gibt bereits die GIL in CPython, so dass der Leistungseinbruch bei der Verwendung eines Schlosses vernachlässigbar ist. Viel teurer sind die Stunden, die für die Fehlersuche in einer komplexen Codebasis aufgewendet werden, wenn sich die Details der CPython-Implementierung eines Tages ändern.
quelle