2017-10-16 7 views
0

J'essaie d'utiliser l'outil de multi-traitement en python (3.4.2) pour accélérer mes performances. Mon programme normal fonctionne bien, mais je dois y traiter un dictionnaire volumineux et imbriqué. Attaché une version simplifiée, ce qui montre mon problème. Si j'utilise directement le TestProc, cela fonctionne, avec le multitraitement non.python multitraitement imbriqué dictionay

Merci pour votre aide!

import multiprocessing 

def TestProc(liste, results): 

    for i in liste: 

     results[i] = {'power':{'square': float(i)**2, 'cubic': 
     float(i)**3},'root':{'square': float(i)**(1/2), 'cubic': float(i)**(1/3)}} 

if __name__ == "__main__": 

    multiprocessing.freeze_support() 
    results = multiprocessing.Manager().dict() 

    results = {} 
    liste = ['1','2','3','4','5'] 

    for i in liste: 

     results[i] = multiprocessing.Manager().dict() 

    print(results) 

    #TestProc(liste, results) 

    p1 = multiprocessing.Process(target=TestProc, args=(liste,results,)) 
    p1.start() 
    p1.join() 

    print(results) 
+0

Vous affectez deux fois de suite 'results' sans utiliser la première valeur, et vous mettez plusieurs' multiprocessing.Manager(). Dict() 'dans les résultats (qu'est-ce que c'est supposé faire , les résultats ne devraient-ils pas commencer * vides *?) – jonatan

Répondre

0

Quand vous faites:

results[i] = ... 

vous n'êtes pas ajouter des valeurs à la DictProxy à results[i], vous remplacez avec une autre marque nouvelle dict, à l'intérieur du results externe dict. Par conséquent, le seul que vous devez synchroniser est celui dict externe.

Remplacez la ligne 15 par results = multiprocessing.Manager().dict() et supprimez la ligne de boucle 18-20 qui n'a jamais rien fait.