"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment éviter les conditions de concurrence lors du partage de dictionnaires en multitraitement ?

Comment éviter les conditions de concurrence lors du partage de dictionnaires en multitraitement ?

Publié le 2024-12-21
Parcourir:990

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

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 se produire, conduisant à des données peu fiables ou corrompues.

Considérons 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 gestionnaire fournit des segments de mémoire partagée accessibles à tous les processus participants.

Voici comment implémenter la synchronisation à l'aide d'un gestionnaire :

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 partagé d, 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}
$ python mul.py
{1: '111', '2': 6}
Cette sortie démontre que le dictionnaire partagé a été synchronisé et mis à jour avec succès par les processus enfants.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3