Tengo una clase que tiene un diccionario
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Y estoy ejecutando 4 hilos (uno para cada restaurante) que llaman al método OrderBook.addOrder
. Aquí está la función ejecutada por cada hilo:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
¿Es seguro o tengo que usar un candado antes de llamar addOrder
?
Respuestas:
Las estructuras integradas de Python son seguras para subprocesos para operaciones únicas, pero a veces puede ser difícil ver dónde una declaración realmente se convierte en operaciones múltiples.
Tu código debe estar seguro. Tenga en cuenta: un candado aquí casi no agregará gastos generales y le dará tranquilidad.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm tiene más detalles.
fuente
Sí, los tipos integrados son inherentemente seguros para subprocesos: http://docs.python.org/glossary.html#term-global-interpreter-lock
fuente
La guía de estilo de Google desaconseja confiar en dict atomicity
Explicado con más detalle en: ¿Es atómica la asignación de variables de Python?
Y estoy de acuerdo con este: ya existe el GIL en CPython, por lo que el impacto en el rendimiento de usar un Lock será insignificante. Mucho más costosas serán las horas dedicadas a la búsqueda de errores en una base de código compleja cuando esos detalles de implementación de CPython cambien algún día.
fuente