Tengo un script que está realizando con éxito un conjunto de tareas de grupo de multiprocesamiento con una imap_unordered()
llamada:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Sin embargo, mi num_tasks
es alrededor de 250,000, por lo que join()
bloquea el hilo principal durante 10 segundos más o menos, y me gustaría poder hacer eco en la línea de comando de forma incremental para mostrar que el proceso principal no está bloqueado. Algo como:
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 un método para el objeto de resultado o el grupo en sí que indique el número de tareas restantes? Intenté usar un multiprocessing.Value
objeto como contador ( do_work
llama a una counter.value += 1
acción después de realizar su tarea), pero el contador solo llega a ~ 85% del valor total antes de dejar de incrementar.
fuente
def do_word(*a): time.sleep(.1)
como ejemplo. Si no funciona para usted, cree un ejemplo de código mínimo completo que demuestre su problema: describa con palabras qué espera que suceda y qué sucede en su lugar, mencione cómo ejecuta su script de Python, cuál es su sistema operativo, versión de Python y publíquelo como una nueva pregunta .Pool.map()
. No me di cuenta de eso soloimap()
yimap_unordered()
trabajo de esta manera: la documentación solo dice "Una versión más perezosa de map ()" pero en realidad significa "el iterador subyacente devuelve resultados a medida que ingresan".imap_unordered()
. El problema de Hanan probablemente se deba asys.stderr.write('\r..')
(sobrescribir la misma línea para mostrar el progreso).