2016-08-08 17 views
5

Mam listę ścieżek obrazu, które chcę podzielić między procesami LUB wątki, tak aby każdy proces przetwarzał część listy. Przetwarzanie obejmuje ładowanie obrazu z dysku, wykonywanie pewnych obliczeń i zwracanie wyniku. Używam Python 2.7 multiprocessing.PoolPython multiprocessing Pool vs multiprocessing ThreadPool

Oto jak tworzę przetwarza pracownik

def ProcessParallel(classifier,path): 
    files=glob.glob(path+"\*.png") 
    files_sorted=sorted(files,key=lambda file_name:int(file_name.split('--')[1])) 
    p = multiprocessing.Pool(processes=4,initializer=Initializer,initargs=(classifier,)) 
    data=p.map(LoadAndClassify, files_sorted) 
    return data 

Kwestia jestem stoi to, że gdy loguję czas inicjalizacji w mojej funkcji Intializer, poznałem, że pracownicy aren” t zainicjowana równolegle, a każdy pracownik jest inicjowany z odstępem 5 sekund Oto logi odsyłające

2016-08-08 12:38:32,043 - custom_logging - INFO - Worker started 
2016-08-08 12:38:37,647 - custom_logging - INFO - Worker started 
2016-08-08 12:38:43,187 - custom_logging - INFO - Worker started 
2016-08-08 12:38:48,634 - custom_logging - INFO - Worker started 

Próbowałem przy użyciu multiprocessing.pool.ThreadPool zamiast która rozpoczyna pracowników w tym samym czasie.
Wiem, jak działa proces wieloprocesowy w systemie Windows i musimy umieścić kod main guard, aby chronić nasz kod przed tworzeniem nieskończonych procesów. Problem w moim przypadku polega na tym, że hostowałem mój skrypt na IIS przy użyciu FASTCGI, a mój skrypt nie jest główny, jest uruchamiany przez proces FastCGI (istnieje skrypt wfastcgi.py, który jest za to odpowiedzialny). Teraz jest główny strażnik wewnątrz wfastcgi.py, a logi wskazują, że nie tworzę nieskończonej liczby procesów.

Teraz chcę wiedzieć, że to, co dokładnie jest przyczyną wieloprocesorowe Basen nie tworząc jednocześnie wątków roboczych, będę naprawdę wdzięczni za każdą pomoc.

EDIT 1: Oto mój Funkcja inicjująca

def Initializer(classifier): 
    global indexing_classifier 
    logger.info('Worker started') 
    indexing_classifier=classifier 
+0

Co robi 'Initializer'? –

+0

Wystarczy, aby zarejestrować czas, w którym pracownik zaczyna i przekazuje zmienną o nazwie "klasyfikator" do każdego pracownika – Ahmed

+0

@MuhammadTahir Proszę spojrzeć na zredagowane pytanie – Ahmed

Odpowiedz

0

miałem wiele problemów próbuje uruchomić wieloprocesorowe pod CGI/WSGI, współpracuje lokalnie, ale nie na realnych serwerach ... Ostatecznie to właśnie isn jest kompatybilny. Jeśli potrzebujesz wieloprocesowego przetwarzania, wyślij asynchroniczne zadania do czegoś takiego jak Seler.

Powiązane problemy