2017-08-28 1 views
0

So das Beispiel ich versuche, hier zu folgen: Python multiprocessing pool.map for multiple argumentsPython mutiprocessing Pool mit Teil Argumente

Was, wenn ich drei Argumente und ich brauche die dritte auf einen Wert festgelegt, z.B. etwas wie das, aber es funktioniert nicht. Raise TypeError, das partial_merge() sagt, nimmt genau 2 Argumente aber nur 1 gegebenes.

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) 

Antwort

1

pool.map() funktioniert wie die ‚normalen‘ map(): es dauert eine Funktion mit einem fehlenden Argumente und einer Liste und wendet die Funktion auf jedes Element der Liste. Der einfachste Weg, um Ihr Problem zu lösen wäre, um Ihre Funktion zu ändern:

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

auf Ihr Ziel/Einstellung Je gibt es andere Möglichkeiten (in zunehmender Komplexität):

  1. Verschlüsse. Beispiel:

    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. gemeinsame Werte: siehe die documentation on sharing state

  3. Warteschlangen und Rohrleitungen: die documentation on queues and pipes

  4. nicht mit Pool, aber mp.Process() sehen, die Sie viel feinere Kontrolle der Argumente und mehr ermöglicht.

Verwandte Themen