В for
петлю, легко отслеживать прогресс, выполнив:Отслеживание прогресса с использованием Process.Pool
total_num = 1000
for num, url in enumerate(urls):
print '%s/%s' (num+1, total_num)
# do something
Как бы отслеживать прогресс с помощью Pool
?
# input data has 4M items
pool = Pool(parallel_workers)
pool.map(run_item, input_data)
Все зависит от того, что вы подразумеваете под «прогрессом». В первом случае вы выбрали одно конкретное понятие: прогресс этапа (в этом случае вехой стал номер итерации). Но что, если некоторые итерации дороже других? Затем, когда вы закончите 50% итераций, вы не обязательно выполняете 50%, поэтому вы можете выбрать что-то другое. Один из подходов к этому для параллельной обработки состоит в том, чтобы запустить код выполнения ('run_item') в базу данных или файл, а затем запустить другое задание для периодического чтения из этого журнала и распечатать некоторое описание в основном процессе. – ely
В простейшем случае каждый процесс может создать временный файл на основе идентификатора процесса. Затем вместо того, чтобы печатать количество итераций, он может записать это в файл. В основном процессе вы можете написать код, чтобы прочитать последнюю строку каждого файла, относящегося к конкретному процессу, и распечатать текст, который суммирует, где каждый процесс. Имейте в виду, что могут возникнуть проблемы с блокировкой файлов, и вы не всегда можете получить абсолютно обновленные номера (но все же лучше, чем ничего); и вы можете понести дополнительную потерю времени ради регистрации. Модуль 'logging' хорош для этого. – ely