2017-08-28 4 views
0

Je suis en train de suivre l'exemple ici: Python multiprocessing pool.map for multiple argumentsPython pool mutiprocessing avec des arguments partiels

Et si j'ai trois arguments et je dois le troisième fixé à une valeur, par exemple quelque chose comme ça mais ça ne marche pas. Raise TypeError disant partial_merge() prend exactement 2 arguments mais seulement 1 donné.

import multiprocessing 
from functools import partial 


def merge_names(a, b, c): 
    return '{} & {} & {}'.format(a, b, c) 


if __name__ == '__main__': 
    names = [('Brown', 'Wilson'), ('Bartlett', 'Rivera'), ('Molloy', 'Opie')] 
    pool = multiprocessing.Pool(processes=3) 

    results = pool.map(partial(merge_names, c='Hello'), names) 
    pool.close() 
    pool.join() 
    print(results) 

Répondre

1

pool.map() fonctionne comme la « normale » map(): il faut une fonction avec un argument manquant et une liste et applique la fonction à chaque élément de la liste. La meilleure façon de résoudre votre problème serait de modifier votre fonction:

def merge_names(tup, c): 
    a, b = tup 
    return '{} & {} & {}'.format(a, b, c) 

En fonction de votre objectif/réglage, il existe d'autres possibilités (augmentation de la complexité):

  1. fermetures. Exemple:

    def func(x): 
        return x + y 
    
    def main(): 
        y = 5 # the point is to declare this BEFORE Pool() is initiated 
        p = mp.Pool(3) 
        data = range(10) 
        results = p.map(func, data) 
    
  2. valeurs partagées: voir les documentation on sharing state

  3. files d'attente et les tuyaux: voir la documentation on queues and pipes

  4. ne pas utiliser la piscine mais mp.Process() qui vous permet un contrôle beaucoup plus fine des arguments et plus.