python map.pool avec 2 arguments

a marqué ce sujet comme résolu.

Bonjour, question concernan tles map, je voudrais lancer un traitement sur une liste en multicoeur, au vue des recherche que je trouve sur internet je me suis tournée sur un pool.map

cela marche tres bien… sauf que je voudrais mettre des armuements dans ma fonction appeler dans le pool

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import multiprocessing

def function1(combinaison):
    other_list=[10,11,12,13,14,15,16,17,18,19]
    return combinaison*len(other_list)

if __name__ == '__main__':


    pool = multiprocessing.Pool(4)

    data_analysis=[0,1,2,3,4,5,6,7,8,9]
    other_list=[10,11,12,13,14,15,16,17,18,19]
    result = pool.map(function1, data_analysis)
    print("result")
    print(result)

je voudrais faire un pool des élements de ma liste data_analysis, cela marche bien mais je voudrais envoyer aussi à ma fonction function1 ma liste other_list

pour l’instant je ne vois qu’une possibilité faire une liste partager en mémoire avec manager mais je trouve cette solution peut élégante, existe t’il une autre option ?

merci, je ne conaissais pas, cela semble répondre à ma question

cependant je pense que je dois mal l’utilisé car mon programme ne m’affiche pas mes print et ma variable result n’affiche plus la liste des return.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import multiprocessing

def function1(combinaison, otherlist):
    myreturn=combinaison*len(other_list)
    print(combinaison)
    print(otherlist)
    print(myreturn)

    return myreturn

if __name__ == '__main__':


    pool = multiprocessing.Pool(4)

    data_analysis=[0,1,2,3,4,5,6,7,8,9]
    other_list=[10,11,12,13,14,15,16,17,18,19]
    #result = pool.map(function1, data_analysis)

    result = pool.apply_async(function1, (data_analysis, other_list))
    print("result")
    print(result)

sauriez vous pourquoi ?

oui, je progresse. j’arrive à obtenir un résultat.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import multiprocessing

def function1(combinaison, otherlist):
    myreturn=combinaison*len(otherlist)
    print(myreturn)

    return myreturn

if __name__ == '__main__':


    pool = multiprocessing.Pool(4)

    data_analysis=[0,1,2,3,4,5,6,7,8,9]
    other_list=[10,11,12,13,14,15,16,17,18,19]
    #result = pool.map(function1, data_analysis)


    result = pool.apply_async(function1, [data_analysis,other_list])
    print(result.get())

par contre cela me retourne la multiplication de mes 2 listes, moi je voudrais multiplier 1 élément de data_analysis par other_list à la fois.

le pool.map me permettais cela sur 4 cœurs en parallèle, ici comment faire ? je ne pense pas faut faire une boucle for ?

apply_async prend les arguments de la fonction, pas une liste d’argument. Il faut que tu fasses toi même la boucle sur data_analysis.

Si tu voulais vraiment continuer à utiliser un map, il y a starmap qui prend une liste de liste d’arguments. Ce serait pas super élégant ici comme ton deuxième argument est toujours le même.

Une troisième possibilité est d’utiliser functools.partial et de maper dessus. C’est probablement le plus propre dans ton cas, en fait.

+0 -0

J’ai l’impression que les problèmes se répètent.

(dans les deux cas les sujets sont mal taggés, donc plus difficile de retomber dessus, mais le sujet apparaît quand même dans la première page des résultats de recherche sur « multiprocessing »)

L’intérêt de Pool.map, c’est de boucler automatiquement, c’est tout. Dans tous les cas, le nombre d’exécution parallèles est contrôlé par le Pool, utiliser apply_async ne te fait pas perdre ça.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte