2014-09-26 12 views
8

Próbuję użyć patosu Pythona do wyznaczania obliczeń w oddzielnych procesach w celu przyspieszenia za pomocą procesora wielordzeniowego. Mój kod jest zorganizowany w następujący sposób:Wieloprocesorowość w Pythonie z patosem

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

Miałem problemy z wytrawianiem w trybie wieloprocesorowym. Postanowiłem spróbować patosu. Próbowałem, jak zasugerowano w poprzednich tematów:

import pathos.multiprocessing 

ale wynikało to z błędem: żaden moduł wieloprocesorowe - czego nie można znaleźć w najnowszej wersji patosu.

Potem próbowałem zmodyfikować metodę boo:

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

Teraz nie ma błędu rzucony, ale foo nie działa - wystąpienie mojej klasie nie ma nowych atrybutów. Proszę, pomóżcie mi, ponieważ nie mam pojęcia, dokąd iść dalej, po dniu spędzonym na tym.

Odpowiedz

17

Jestem autorem pathos. Nie jestem pewien, co chcesz zrobić z powyższego kodu. Mogę jednak rzucić trochę światła. Oto niektóre podobny kod:

>>> 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 

Więc co się dzieje powyżej, jest to, że metoda instancji bBarboo nazywa gdzie b.boo jest przekazywana do nowego procesu Pythona, a następnie oceniano pod kątem każdego z zagnieżdżonych list. Możesz zobaczyć, że wyniki są poprawne ... len ("12") + len ("3") + len ("456") to 6, i tak dalej.

Jednak można również zauważyć, że gdy patrzy się na b.sum, to w tajemniczy sposób nadal jest to 0. Dlaczego b.sum nadal jest zero? No cóż, to, co robi multiprocessing (a więc także pathos.multiprocessing), powoduje, że przechodzimy przez mapę do innego procesu Pythona ... a następnie kopiowana instancja jest wywoływana (równolegle) i zwraca wszelkie wyniki wywoływane przez metoda wywołana. Pamiętaj, że musisz wykonać POWRÓT lub wydrukować je, albo zalogować, albo wysłać do pliku, lub w inny sposób. Nie mogą wrócić do pierwotnej instancji, jak można się spodziewać, ponieważ nie jest to oryginalna instancja przesłana do innych procesorów. Kopie instancji są tworzone, a następnie usuwane - każdy z nich miał zwiększony atrybut sum, ale oryginalny "b.sum" jest nietknięty.

Istnieje jednak planuje w ciągu pathos zrobić coś jak wyżej pracy jak można się spodziewać - w przypadku gdy oryginalny obiekt JEST aktualizowane, ale to nie działa w ten sposób jeszcze.

EDIT: Jeśli instalujesz z pip, trzeba pamiętać, że najnowsza wersja zwolniony z pathos ma już kilka lat, i nie może zainstalować prawidłowo, czy też nie może instalować wszystkich submodules. Nowe wydanie pathos jest w toku, ale do tego czasu lepiej jest pobrać najnowszą wersję kodu z github i zainstalować z niego. Pień jest w większości stabilny w fazie rozwoju. Wydaje mi się, że problem polegał na tym, że nie wszystkie pakiety zostały zainstalowane z powodu "starej" pip - "starej" pathos niekompatybilności w instalacji. Jeśli brakuje pathos.multiprocessing, jest to najbardziej prawdopodobny sprawca.

Get pathos z github tutaj: https://github.com/uqfoundation/pathos

+0

mam ten sam problem co OP tutaj. Mogę zrobić 'import pathos', ale' import pathos.multiprocessing' daje mi błąd błędu modułu. Jaki może być tego powód? – sashkello

+0

Problem polega na tym, że nie rozumiem pytania OP ... z powodu pewnej bariery w języku angielskim, a także minimalnych próbek kodu. Może mogę spróbować innego podejścia. Może wszystkie zależności nie zostały zainstalowane. Czy możesz "zaimportować przetwarzanie"? Co powiesz na 'from processing.pool import Pool'? Co powiesz na 'from pathos.helpers import mp_helper' lub' from pathos.helpers import ProcessPool'? A co z 'import pp' i' from pathos.helpers import pp_helper'? –

+0

'from pathos.helpers import *' daje "Brak modułów o nazwie helpers". Jakoś nie wszystkie patos jest dostępny dla mnie i wydaje się, że OP. Zainstalowałem go z pip, to jest najnowsza wersja. – sashkello

Powiązane problemy