2015-02-10 4 views
0

В 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) 
+1

Все зависит от того, что вы подразумеваете под «прогрессом». В первом случае вы выбрали одно конкретное понятие: прогресс этапа (в этом случае вехой стал номер итерации). Но что, если некоторые итерации дороже других? Затем, когда вы закончите 50% итераций, вы не обязательно выполняете 50%, поэтому вы можете выбрать что-то другое. Один из подходов к этому для параллельной обработки состоит в том, чтобы запустить код выполнения ('run_item') в базу данных или файл, а затем запустить другое задание для периодического чтения из этого журнала и распечатать некоторое описание в основном процессе. – ely

+0

В простейшем случае каждый процесс может создать временный файл на основе идентификатора процесса. Затем вместо того, чтобы печатать количество итераций, он может записать это в файл. В основном процессе вы можете написать код, чтобы прочитать последнюю строку каждого файла, относящегося к конкретному процессу, и распечатать текст, который суммирует, где каждый процесс. Имейте в виду, что могут возникнуть проблемы с блокировкой файлов, и вы не всегда можете получить абсолютно обновленные номера (но все же лучше, чем ничего); и вы можете понести дополнительную потерю времени ради регистрации. Модуль 'logging' хорош для этого. – ely

ответ

0

Очень рудиментарным примерным способом было бы иметь глобальную переменную, а затем определять размер этого на протяжении всего хода. Вот пример:

global progress 
progress = set() 

def run_item(input_data): 
    progress.add(url) 
    print len(progress) * parallel_workers 
Смежные вопросы