2014-09-26 27 views
8

Sto cercando di utilizzare il pathos di Python per designare i calcoli in processi separati per accelerarlo con un processore multicore. Il mio codice è organizzato come:Multiprocessing di Python con pathos

class: 
    def foo(self,name): 
    ... 
    setattr(self,name,something) 
    ... 
    def boo(self): 
     for name in list: 
     self.foo(name) 

Come ho avuto problemi di decapaggio con multiprocessing.Pool, ho deciso di provare pathos. ho provato, come suggerito in precedenti argomenti:

import pathos.multiprocessing 

ma si è tradotto in errore: Nessun modulo multiprocessing - che non riesco a trovare in ultima versione pathos.

Poi ho cercato di modificare il metodo boo:

def boo(self): 
import pathos 
pathos.pp_map.pp_map(self.foo,list) 

Ora non v'è alcun errore gettato, ma pippo non funziona - istanza della mia classe non ha nuovi attributi. Per favore aiutami, perché non ho idea di dove spostarmi dopo, dopo una giornata trascorsa su quello.

risposta

17

Sono l'autore pathos. Non sono sicuro di cosa vuoi fare dal tuo codice qui sopra. Tuttavia, posso forse fare un po 'di luce. Ecco un po 'di codice simile:

>>> from pathos.multiprocessing import ProcessingPool 
>>> class Bar: 
... def foo(self, name): 
...  return len(str(name)) 
... def boo(self, things): 
...  for thing in things: 
...  self.sum += self.foo(thing) 
...  return self.sum 
... sum = 0 
... 
>>> b = Bar() 
>>> results = ProcessingPool().map(b.boo, [[12,3,456],[8,9,10],['a','b','cde']]) 
>>> results 
[6, 4, 5] 
>>> b.sum 
0 

Che cosa succede al di sopra, è che il metodo del Bar istanza bboo si chiama dove b.boo è passato ad un nuovo processo di pitone, e quindi valutati per ciascuna delle liste nidificate. Puoi vedere che i risultati sono corretti ... len ("12") + len ("3") + len ("456") è 6, e così via.

Tuttavia, è anche possibile vedere che quando si guarda b.sum, è misteriosamente ancora 0. Perché lo b.sum è ancora zero? Bene, ciò che fa multiprocessing (e quindi anche pathos.multiprocessing), è una COPIA di qualunque cosa si passi attraverso la mappa verso l'altro processo python ... e quindi l'istanza copiata viene quindi chiamata (in parallelo) e restituisce qualunque risultato vengono chiamati da il metodo invocato. Nota che devi ottenere i risultati RETURN oppure stamparli o registrarli o inviarli a un file o in altro modo. Non possono tornare all'istanza originale come ci si potrebbe aspettare, perché non è l'istanza originale che viene inviata agli altri processori. Le copie dell'istanza vengono create, quindi eliminate - a ciascuna di esse è stato aumentato l'attributo sum, ma l'originale `b.sum 'non è stato modificato.

V'è tuttavia, prevede entro pathos per fare qualcosa di simile al lavoro di cui sopra, come ci si potrebbe aspettare - in cui l'oggetto originale IS aggiornato, ma non funziona così ancora.

EDIT: Se si installa con pip, notare che l'ultima versione rilasciata di pathos è di diversi anni, e non può installare correttamente, o non può installare tutti i moduli. È in sospeso una nuova versione pathos, ma fino ad allora è meglio ottenere l'ultima versione del codice da github e installare da lì. Il tronco è per lo più stabile in fase di sviluppo. Penso che il tuo problema potrebbe essere stato che non tutti i pacchetti sono stati installati, a causa di una "nuova" incompatibilità pathos "vecchia" pathos nell'installazione. Se manca pathos.multiprocessing, questo è il colpevole più probabile.

Get pathos da github qui: https://github.com/uqfoundation/pathos

+0

Ho lo stesso problema, come OP qui. Posso fare "import pathos", ma "import pathos.multiprocessing" mi dà un errore non trovato nel modulo. Quale potrebbe essere la ragione per questo? – sashkello

+0

Il problema è che non capisco la domanda dell'OP ... a causa di qualche barriera nell'inglese e anche dei campioni di codice minimo. Forse posso provare un altro approccio. Forse tutte le dipendenze non sono state installate. Puoi importare elaborazione? Che ne dite di 'from processing.pool import Pool'? Che ne dite di 'from pathos.helpers import mp_helper' o' from pathos.helpers import ProcessPool'? Che dire di 'import pp' e' from pathos.helpers import pp_helper'? –

+0

'from pathos.helpers import *' fornisce "Nessun modulo denominato helper". In qualche modo non tutto il pathos è disponibile per me e sembra OP. L'ho installato da pip, è l'ultima versione. – sashkello

Problemi correlati