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!