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.Pool
Python 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
Co robi 'Initializer'? –
Wystarczy, aby zarejestrować czas, w którym pracownik zaczyna i przekazuje zmienną o nazwie "klasyfikator" do każdego pracownika – Ahmed
@MuhammadTahir Proszę spojrzeć na zredagowane pytanie – Ahmed