141 votes

Thread Safety dans le dictionnaire Python

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'exécute 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 ?

40voto

Brandon Invergo Points 2104

Oui, les types intégrés sont intrinsèquement thread-safe : http://docs.python.org/glossary.html#term-global-interpreter-lock

Cela simplifie l'implémentation de CPython en rendant le modèle objet ( y compris les types intégrés critiques tels que dict ) implicitement sécurisé contre les accès concurrents.

2voto

ravi malhotra Points 409

Lorsque vous utilisez le dict intégré de python, set et get sont atomiques (à cause de Cpython's GIL).Cependant, cela semble être une mauvaise pratique car les opérations telles que .items ne sont pas atomiques.

Remarque - les opérations get-add-set ne sont pas thread-safe si plusieurs threads fonctionnent sur les mêmes clés dict.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X