Ho uno script che esegue con successo un set di attività Pool multiprocessing con una imap_unordered()
chiamata:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Tuttavia, my num_tasks
è di circa 250.000, quindi join()
blocca il thread principale per circa 10 secondi e mi piacerebbe essere in grado di eseguire l'eco sulla riga di comando in modo incrementale per mostrare che il processo principale non è bloccato. Qualcosa di simile a:
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)
Esiste un metodo per l'oggetto risultato o per il pool stesso che indica il numero di attività rimanenti? Ho provato a utilizzare un multiprocessing.Value
oggetto come contatore ( do_work
richiama counter.value += 1
un'azione dopo aver svolto il suo compito), ma il contatore arriva solo a ~ 85% del valore totale prima di interrompere l'incremento.