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_taskswynosi 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.Valueobiektu jako licznika ( do_workwywołuje counter.value += 1akcję po wykonaniu swojego zadania), ale licznik osiąga tylko ~ 85% całkowitej wartości przed zatrzymaniem zwiększania.