Próbuję podzielić na pętli tjProcess.join() i kolejka nie działają z dużą liczbą
N = 1000000
for i in xrange(N):
#do something
wykorzystaniem multiprocessing.Process i to działa dobrze dla małych wartości N. Problem pojawia się, gdy Używam większych wartości N. Coś dziwnego dzieje się przed lub w trakcie p.join() i program nie odpowiada. Jeśli umieściłem print i, zamiast q.put (i) w definicji funkcji f wszystko działa dobrze.
Byłbym wdzięczny za każdą pomoc. Oto kod.
from multiprocessing import Process, Queue
def f(q,nMin, nMax): # function for multiprocessing
for i in xrange(nMin,nMax):
q.put(i)
if __name__ == '__main__':
nEntries = 1000000
nCpu = 10
nEventsPerCpu = nEntries/nCpu
processes = []
q = Queue()
for i in xrange(nCpu):
processes.append(Process(target=f, args=(q,i*nEventsPerCpu,(i+1)*nEventsPerCpu)))
for p in processes:
p.start()
for p in processes:
p.join()
print q.qsize()
Dziękujemy! To działa. – Puibo
Wysyłam mój skrypt do maszyny, która ma około 30 procesorów, więc przy 10 procesach wciąż jestem daleko od max. Czy są jakieś inne powody, dla których powinienem zmniejszyć liczbę procesów? Przeprowadzam analizę danych (50 g danych, czyli około 9 milionów zdarzeń). Moim pomysłem było podzielenie danych na części (na przykład 10) i użycie przetwarzania wieloprocesowego. Jeśli masz jakąkolwiek radę, byłbym wdzięczny. – Puibo
Więcej procesów jest dobre w stosunku do liczby procesorów - nawet po liczbie procesorów, jeśli procesy będą czasami blokowane. Sposób, w jaki sformułowano twoje wstępne pytanie, myślałam, że może to był problem z zadaniami domowymi programowania - nie wiedziałeś, że masz potężną maszynę :) W każdym razie, jedną miarą do rozważenia jest to, ile przyspieszasz, robiąc rzeczy jednotomowe - - jeśli masz 10-krotne przyspieszenie z 10 procesami (mało prawdopodobne), to świetnie! Zredukowanie zależności (oczekiwania) między procesami jest kluczowe - jak już zauważyłeś, musisz drenować kolejkę. –