J'ai un script qui effectue avec succès un ensemble de tâches de pool multitraitement avec un imap_unordered()
appel:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Cependant, mon num_tasks
est d'environ 250000, et donc le join()
verrouillage du thread principal pendant environ 10 secondes, et j'aimerais pouvoir faire écho à la ligne de commande de manière incrémentielle pour montrer que le processus principal n'est pas verrouillé. Quelque chose comme:
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)
Existe-t-il une méthode pour l'objet de résultat ou le pool lui-même qui indique le nombre de tâches restantes? J'ai essayé d'utiliser un multiprocessing.Value
objet comme compteur ( do_work
appelle une counter.value += 1
action après avoir effectué sa tâche), mais le compteur n'atteint que ~ 85% de la valeur totale avant d'arrêter l'incrémentation.