Maison >développement back-end >Tutoriel Python >Comment puis-je garantir la cohérence des données dans un dictionnaire global accessible par plusieurs processus enfants ?

Comment puis-je garantir la cohérence des données dans un dictionnaire global accessible par plusieurs processus enfants ?

DDD
DDDoriginal
2024-12-15 01:26:11343parcourir

How can I ensure data consistency in a global dictionary accessed by multiple child processes?

Multitraitement : aborder la synchronisation et le partage de données dans les dictionnaires mondiaux

Dans un environnement multithread, la gestion de l'accès simultané aux données et le maintien de la synchronisation deviennent cruciaux. Considérons un programme avec plusieurs processus enfants travaillant sur une file d'attente et manipulant un dictionnaire global, D.

Lorsqu'un processus enfant modifie D, ces mises à jour sont visibles dans le processus. Cependant, une fois que le processus principal a rejoint la file d'attente, l'impression de D dans le processus principal révèle un dictionnaire vide. Ceci est dû à des problèmes de synchronisation lors de l'accès à la ressource partagée, D.

Pour résoudre ce problème, un objet Manager peut être utilisé. La classe Manager en multitraitement permet la création et la gestion d'objets partagés, notamment des dictionnaires. Le code python ajusté suivant démontre son utilisation :

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)

En utilisant l'objet Manager, le dictionnaire partagé, D, est stocké dans un emplacement de mémoire partagé accessible à tous les processus. Cela garantit la synchronisation et évite les conditions de concurrence lors de l'accès au dictionnaire, même entre plusieurs processus.

L'exécution de ce code modifié devrait produire le résultat suivant :

{1: '111', '2': 6}

démontrant que les modifications apportées par les processus enfants dans le dictionnaire partagé sont visibles et persistants même après avoir rejoint les processus.

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