Synchronisation et Communication
Glissez pour afficher le menu
Lors de l'utilisation de threads ou de processus, il est souvent nécessaire de partager des données ou de coordonner leurs actions. Sans synchronisation appropriée, deux threads peuvent essayer de modifier la même variable simultanément, ce qui conduit à des résultats imprévisibles appelés conditions de concurrence (race conditions). Pour éviter cela, Python propose des primitives de synchronisation telles que les verrous (locks), les files d'attente (queues) et la mémoire partagée (shared memory).
Un verrou est un mécanisme simple qui garantit qu'un seul thread peut accéder à une portion de code ou à une donnée à la fois. Si un thread acquiert un verrou, les autres threads qui tentent de l'acquérir devront attendre qu'il soit libéré. Cela empêche plusieurs threads d'effectuer des modifications conflictuelles.
Les files d'attente sont un autre outil puissant pour une communication sécurisée entre threads et processus. Une file d'attente permet à un thread ou à un processus d'ajouter des données en toute sécurité, tandis qu'un autre les retire. La classe queue.Queue (pour les threads) et multiprocessing.Queue (pour les processus) gèrent tous les verrous nécessaires en interne, vous n'avez donc pas à vous soucier des conditions de concurrence.
Avec la mémoire partagée, les processus peuvent accéder directement aux mêmes données, mais il faut utiliser des primitives de synchronisation comme les verrous ou les sémaphores pour éviter les conflits. Dans la plupart des cas, l'utilisation de files d'attente est plus simple et plus sûre pour la communication inter-processus.
La vidéo ci-dessus montre comment un verrou peut empêcher deux threads de corrompre des données partagées, et comment une file d'attente peut être utilisée pour transmettre des données en toute sécurité entre des tâches concurrentes.
1234567891011121314151617181920212223import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion