2013-06-18 13 views
12

Jest to kwestia początkujących:Używanie Pythona multiprocessing.Process klasę

Klasa jest obiektem, więc mogę utworzyć klasę o nazwie pippo() i wewnątrz tej funkcji i dodać parametr, ja nie rozumiem, jeśli funkcje wewnątrz pippo są wykonywane od góry do dołu, gdy przypisuję x=pippo() lub muszę je nazwać x.dosomething() poza pippo.

Praca z pakietem wieloprocesorowej Pythona, lepiej jest określić wielką funkcję i utworzyć obiekt za pomocą target argument w wywołaniu Process(), lub stworzyć własną klasę proces poprzez dziedziczenie z Process klasie?

+0

W pierwszej części pytania, jeśli chcesz, aby funkcja była wykonywana, gdy obiekt jest tworzony, możesz wywołać do niego funkcję w klasie "__init__". Możesz również [dekorator nieruchomości] (http://docs.python.org/2/library/functions.html#property). Nie jestem pewien, o co pytasz w drugiej części. Czy mógłbyś wyjaśnić? –

+0

Najczęściej będziesz wywoływał metody klasy poprzez odwołanie do obiektu, takie jak 'x.doSomthing()'. Możesz również użyć tych metod wewnętrznie zaraz po utworzeniu obiektu, wywołując je metodą klasy "__init__". Jeśli chcesz, aby metody obiektu uruchamiały się jako proces, można to zrobić na kilka sposobów. Moim osobistym faworytem jest podklasa z "Procesu". Wyjaśniam jeden sposób, aby to zrobić tutaj: http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH

Odpowiedz

23

Często zastanawiałem się, dlaczego strona dokumentu Pythona na multiprocessing pokazuje tylko "funkcjonalne" podejście (używając parametru target). Prawdopodobnie dlatego, że zwięzłe, zwięzłe fragmenty kodu są najlepsze do celów ilustracyjnych. Dla małych zadań, które mieszczą się w jednej funkcji, mogę zobaczyć, jak to jest preferowanym sposobem, ala:

from multiprocessing import Process 

def f(): 
    print('hello') 

p = Process(target=f) 
p.start() 
p.join() 

Ale kiedy trzeba większą organizację kodu (dla złożonych zadań), tworzyć własne klasy jest droga :

from multiprocessing import Process 

class P(Process): 
    def __init__(self): 
     super(P, self).__init__() 
    def run(self): 
     print('hello') 

p = P() 
p.start() 
p.join() 

Należy pamiętać, że każdy zainicjowany proces jest inicjowany za pomocą kopii śladu pamięci głównego procesu. I że kod konstruktora (tj. Materiał wewnątrz __init__()) jest wykonywany w procesie głównym - tylko kod wewnątrz run() jest wykonywany w oddzielnych procesach.

Dlatego jeśli proces (master lub spawned) zmienia jego zmienną składową, zmiana nie zostanie odzwierciedlona w innych procesach. Jest to oczywiście prawdziwe tylko w przypadku typów wejściowych, takich jak: bool, string, list itd. Można jednak importować "specjalne" struktury danych z modułu multiprocessing, które są następnie przezroczyście dzielone między procesami (patrz Sharing state between processes.) Lub może tworzyć własne kanały IPC (komunikacja między procesami), takie jak multiprocessing.Pipe i multiprocessing.Queue.

+2

Nie wymaga przetwarzania wieloprocesowego 'jeśli __name__ ==" __main __ "' jeśli używasz Windowsa? Kolejna niespodzianka na uwagę: –

+0

Jeśli proces odradzania zmienił niektóre typy danych w swojej klasie, czy te zmiany byłyby widoczne z procesu głównego? – Woody1193

+0

@ Woody1193, nie dla wbudowanych typów danych. Ale jeśli użyjesz specjalnych współdzielonych typów danych z modułu 'multiprocessing', uzyskasz pożądany efekt. (Dodałem to wyjaśnienie do powyższej odpowiedzi.) –

Powiązane problemy