У меня есть сценарий, который успешно выполняет набор задач многопроцессорного пула с imap_unordered()
вызовом:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Однако у меня num_tasks
около 250 000, поэтому join()
основной поток блокируется на 10 секунд или около того, и я хотел бы иметь возможность выводить эхо в командную строку постепенно, чтобы показать, что основной процесс не заблокирован. Что-то вроде:
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)
Есть ли метод для объекта результата или самого пула, который указывает количество оставшихся задач? Я попытался использовать multiprocessing.Value
объект в качестве счетчика ( do_work
вызывает counter.value += 1
действие после выполнения своей задачи), но счетчик достигает только ~ 85% от общего значения перед остановкой увеличения.