Maison  >  Article  >  développement back-end  >  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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-26 12:20:09439parcourir

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 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn