Używam „multiprocess.Pool.imap_unordered” w następujący sposób
from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
do some additional processing on mapped_result
Czy muszę dzwonić, pool.close
czy pool.join
po pętli for?
pool.join()
wtedypool.close()
po uruchomieniu wszystkich wątków puli, ale nie próbowałem używać gopool.imap_unordered()
jako iterowalnego.Odpowiedzi:
Nie, nie możesz, ale to prawdopodobnie dobry pomysł, jeśli nie zamierzasz już korzystać z basenu.
Powody, dla których warto dzwonić
pool.close
lubpool.join
są dobrze opisane przez Tima Petersa w tym poście SO :źródło
pool.close()
pierwszy ipool.join()
drugi. Pozwala to na dodawanie pracy międzypool.close()
ipool.join()
, która nie musi czekać na zakończenie wykonywania puli.pool.close()
najpierw zadzwonić , w rzeczywistości jest to obowiązkowe. Z dokumentacji : należy zadzwonićclose()
lubterminate()
przed użyciemjoin()
.Miałem ten sam problem pamięci jako Memory użytkowania stale rosnąć z multiprocessing.pool Pythona , kiedy nie używać
pool.close()
, apool.join()
podczas korzystaniapool.map()
z funkcji, która oblicza Odległość Levenshteina. Funkcja działała dobrze, ale nie była poprawnie zbierana na komputerze z systemem Win7 64, a zużycie pamięci wymykało się spod kontroli za każdym razem, gdy funkcja była wywoływana, aż do wyłączenia całego systemu operacyjnego. Oto kod, który naprawił wyciek:stringList = [] for possible_string in stringArray: stringList.append((searchString,possible_string)) pool = Pool(5) results = pool.map(myLevenshteinFunction, stringList) pool.close() pool.join()
Po zamknięciu i wejściu do puli wyciek pamięci zniknął.
źródło
ERROR: Terminated with signal 15
zanim dodałem kod czyszczenia,pool.close();pool.join();
ale po dodaniu tego kodu czyszczenia nie otrzymuję komunikatów konsoli. więc podejrzewam, przynajmniej w mojej wersji, Python 2.7 z C7, że pula może w jakiś sposób nie sprzątała dokładnie.