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.
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'. –