J'ai une classe qui contient un dictionnaire
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Et j'utilise 4 threads (un pour chaque restaurant) qui appellent la méthode OrderBook.addOrder
. Voici la fonction exécutée par chaque thread:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Est-ce sûr ou dois-je utiliser un verrou avant d'appeler addOrder
?
Réponses:
Les structures intégrées de Python sont thread-safe pour des opérations uniques, mais il peut parfois être difficile de voir où une instruction devient réellement plusieurs opérations.
Votre code doit être sûr. Gardez à l'esprit: un verrou ici n'ajoutera presque pas de frais généraux et vous donnera la tranquillité d'esprit.
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm a plus de détails.
la source
Oui, les types intégrés sont intrinsèquement thread-safe: http://docs.python.org/glossary.html#term-global-interpreter-lock
la source
Le guide de style de Google déconseille de s'appuyer sur l'atomicité de dict
Expliqué plus en détail sur: L'affectation de variable Python est-elle atomique?
Et je suis d'accord avec celui-ci: il y a déjà le GIL dans CPython, donc la performance de l'utilisation d'un verrou sera négligeable. Les heures passées à rechercher des bogues dans une base de code complexe seront beaucoup plus coûteuses lorsque ces détails d'implémentation CPython changent un jour.
la source