Eu tenho um script que executa com sucesso um conjunto de tarefas de pool de multiprocessamento com uma imap_unordered()
chamada:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
No entanto, meu num_tasks
é cerca de 250.000 e, portanto, join()
bloqueia o thread principal por 10 segundos ou mais, e eu gostaria de poder ecoar na linha de comando de forma incremental para mostrar que o processo principal não 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 um método para o objeto de resultado ou o próprio pool que indica o número de tarefas restantes? Tentei usar um multiprocessing.Value
objeto como contador ( do_work
chama uma counter.value += 1
ação após realizar sua tarefa), mas o contador atinge apenas ~ 85% do valor total antes de parar o incremento.