Maison > Article > développement back-end > Comment éviter les conditions de concurrence lors du partage de dictionnaires en multitraitement ?
Comment synchroniser l'accès aux dictionnaires partagés en multitraitement
Dans un environnement multitraitement, plusieurs processus peuvent nécessiter l'accès à des données partagées, comme un dictionnaire. Cependant, si des mécanismes de synchronisation appropriés ne sont pas mis en œuvre, des conditions de concurrence peuvent survenir, conduisant à des données peu fiables ou corrompues.
Considérez un scénario dans lequel plusieurs processus enfants accèdent à un dictionnaire global D tout en travaillant sur une file d'attente partagée Q. Initialement, le dictionnaire semble stocker les résultats modifiés par les processus enfants. Cependant, une fois que le processus principal rejoint Q, le dictionnaire D devient vide.
Ce problème provient de la nature asynchrone du multitraitement. Chaque processus enfant possède son propre espace mémoire et les modifications apportées aux variables partagées peuvent ne pas être immédiatement visibles par les autres processus sans une synchronisation appropriée.
Utilisation d'un objet Manager pour la synchronisation
Une solution courante pour synchroniser l'accès aux données partagées en multitraitement consiste à utiliser un objet Manager. Un Manager fournit des segments de mémoire partagée accessibles à tous les processus participants.
Voici comment implémenter la synchronisation à l'aide d'un Manager :
from multiprocessing import Process, Manager def f(d): d[1] += '1' d['2'] += 2 if __name__ == '__main__': manager = Manager() d = manager.dict() d[1] = '1' d['2'] = 2 p1 = Process(target=f, args=(d,)) p2 = Process(target=f, args=(d,)) p1.start() p2.start() p1.join() p2.join() print(d)
Dans cet exemple, l'objet Manager crée un dictionnaire d, qui est accessible par les deux processus enfants. Lorsqu'un processus enfant modifie le dictionnaire, les modifications sont immédiatement visibles par les autres processus.
Sortie :
$ python mul.py {1: '111', '2': 6}
Cette sortie démontre que le dictionnaire partagé a été exécuté avec succès. synchronisé et mis à jour par les processus enfants.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!