Mam skrypt, który pomyślnie wykonuje zestaw zadań z puli wieloprocesorowej z imap_unordered()
wywołaniem:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Jednak mój num_tasks
wynosi około 250 000, więc join()
blokuje główny wątek na około 10 sekund i chciałbym móc stopniowo wyświetlać echo do wiersza poleceń, aby pokazać, że główny proces nie jest zablokowany. Coś jak:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
if (remaining == 0): break # Jump out of while loop
print "Waiting for", remaining, "tasks to complete..."
time.sleep(2)
Czy istnieje metoda dla obiektu wynikowego lub samej puli, która wskazuje liczbę pozostałych zadań? Próbowałem użyć multiprocessing.Value
obiektu jako licznika ( do_work
wywołuje counter.value += 1
akcję po wykonaniu swojego zadania), ale licznik osiąga tylko ~ 85% całkowitej wartości przed zatrzymaniem zwiększania.