2013-01-22 15 views
6

Ciao, ho lottato con questo per la parte migliore della mattinata e speravo che qualcuno potesse indicarmi la giusta direzione.Passare una funzione che accetta funzioni membro membro come variabili in python multiprocess pool.map()

Questo è il codice che ho in questo momento:

def f(tup): 
    return some_complex_function(*tup) 

def main(): 

    pool = Pool(processes=4) 
    #import and process data omitted 
    _args = [(x.some_func1, .05, x.some_func2) for x in list_of_some_class] 
    results = pool.map(f, _args) 
    print results 

Il primo errore che ottengo è:

> Exception in thread Thread-2: Traceback (most recent call last): 
> File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner 
>  self.run() File "/usr/lib/python2.7/threading.py", line 504, in run 
>  self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in 
> _handle_tasks 
>  put(task) PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

8

Il modulo multiprocess utilizza il modulo pickle per serializzare gli argomenti passati alla funzione (f), che viene eseguita in un altro processo.

Molti dei tipi predefiniti possono essere decapitati, ma i metodi di istanza non possono essere decapitati. Quindi .05 va bene, ma non lo è il x.some_func1. Vedi What can be pickled and unpickled? per maggiori dettagli.

Non c'è una soluzione semplice. Dovrai ristrutturare il tuo programma in modo che i metodi di istanza non debbano essere passati come argomenti (o evitare di usare multiprocess).

+0

Grazie ha suggerito e ristrutturato – ast4

3

Se si utilizza un fork di multiprocessing chiamato pathos.multiprocesssing, è possibile utilizzare direttamente classi e metodi di classe nelle funzioni map di multiprocessing. Questo perché dill viene utilizzato al posto di pickle o cPickle e dill può serializzare quasi tutto in python.

pathos.multiprocessing fornisce anche una funzione di mappa asincrona ... e può map funzioni con più argomenti (ad esempio map(math.pow, [1,2,3], [4,5,6]))

See: What can multiprocessing and dill do together?

e: http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

>>> from pathos.multiprocessing import ProcessingPool as Pool 
>>> 
>>> p = Pool(4) 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> x = [0,1,2,3] 
>>> y = [4,5,6,7] 
>>> 
>>> p.map(add, x, y) 
[4, 6, 8, 10] 
>>> 
>>> class Test(object): 
... def plus(self, x, y): 
...  return x+y 
... 
>>> t = Test() 
>>> 
>>> p.map(Test.plus, [t]*4, x, y) 
[4, 6, 8, 10] 
>>> 
>>> p.map(t.plus, x, y) 
[4, 6, 8, 10] 

Crea il codice qui: https://github.com/uqfoundation/pathos

Problemi correlati