2017-08-29 4 views
2

C'est une version vraiment simpliste d'un code plus compliqué avec lequel je travaille. Le problème est que je voudrais ajouter des éléments calculés dans la fonction method() à une liste que je peux afficher plus tard. Cependant, lorsque ce code est exécuté, l'objet liste est vide, tandis que le tableau de résultats est plein.Comment ajouter des éléments à une liste dans un processus parallèle (python)?

import multiprocessing as mp 
    global list 
    list = [] 
    def add(thing): 
     list.append(thing) 
    def method(): 
     global list 
     add(8) #doesn't work as wanted 
     return 7 
    def logResult(result): 
     results.append(result) 

    if (__name__ == '__main__'): 
     results = [] 
     cpu = mp.cpu_count() 
     pool = mp.Pool(processes=cpu) 
     for x in range(0, 2000): 
      pool.apply_async(method,callback=logResult) 
     pool.close() 
     pool.join() 
     print list 
     print results 

Sortie:

[] 
    [7,7,7,7,7,7,7,7,7....] and so on. 

Je sais que la méthode add semble fonction redondante, mais un simple list.append() dans la méthode() ne fonctionne pas non plus. La méthode add est conçue pour refléter la méthode logResult(). Je peux voir pourquoi ça ne marche pas, mais je ne sais pas comment réparer ça. Sans la parallélisation, le programme fonctionne comme souhaité, mais la parallélisation est nécessaire pour mon projet car le calcul effectué est beaucoup plus fastidieux que dans la fonction method(). La sortie désirée serait

[8,8,8,8,8,8,8,8,8,8,8,8,...] 
    [7,7,7,7,7,7,7,7,7,7,7,7,...] and so on. 

Merci d'avance.

+1

Les variables globales ne peuvent pas être partagées entre les processus python. La solution la plus simple est de renvoyer 7 et 8 de 'method' et de rassembler ensuite les 8 dans une liste. Voir 'Pool.map'. –

Répondre

0

Il semble que vous ayez défini global list dans la méthode() qui est vide. il ne nécessite pas de méthode() si vous l'avez déjà défini.

0
pool.apply_async(method,callback=logResult) 
  1. Vos fonctions de méthode manquent().
  2. logResult devrait avoir quelque chose à transmettre (selon votre code)

changeant simplement à ceci:

pool.apply_async(method(),callback=logResult(7)) 

résultat get [8,8,8,8,8 ...] , [7,7,7,7,7 ...]