У меня есть сценарий, который успешно выполняет набор задач многопроцессорного пула с 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% от общего значения перед остановкой увеличения.
источник
def do_word(*a): time.sleep(.1)
в качестве примера. Если это не сработает для вас, создайте полный пример минимального кода, который демонстрирует вашу проблему: опишите словами, что вы ожидаете, и что произойдет вместо этого, укажите, как вы запускаете свой скрипт Python, какая у вас ОС, версия Python и опубликуйте как новый вопрос .Pool.map()
. Я не осознавал этого толькоimap()
иimap_unordered()
работал таким образом - в документации просто говорится: «Более ленивая версия map ()», но на самом деле это означает, что «базовый итератор возвращает результаты по мере их поступления».imap_unordered()
. Проблема Ханана, вероятно, связана сsys.stderr.write('\r..')
(перезаписью той же строки, чтобы показать прогресс).Мой личный фаворит - дает вам симпатичную маленькую шкалу прогресса и время завершения, пока все выполняются и фиксируются параллельно.
источник
pip install tqdm
Я обнаружил, что работа уже была сделана, когда я попытался проверить ее продвижение. Это то, что у меня сработало при использовании tqdm .
pip install tqdm
Это должно работать со всеми разновидностями многопроцессорной обработки, независимо от того, блокируют они или нет.
источник
Нашел ответ сам с некоторыми более рытье: Принимая взгляд на
__dict__
частьimap_unordered
объекта результата, я нашел , что это имеет_index
атрибут , который увеличивается с каждым завершения задачи. Итак, это работает для ведения журнала, заключенного вwhile
цикл:Однако я обнаружил, что замена
imap_unordered
a на a приводитmap_async
к гораздо более быстрому выполнению, хотя объект результата немного отличается. Вместо этого объект результата изmap_async
имеет_number_left
атрибут иready()
метод:источник
rs
будет известно, и это немного поздно или нет?rs
уже были запущены другие потоки.rs
ни одного цикла, я новичок в многопроцессорной обработке, и это поможет. Большое спасибо.python 3.5
, с помощью решения_number_left
не работает._number_left
представляет фрагменты, которые еще предстоит обработать. Например, если я хочу, чтобы 50 элементов передавались моей функции параллельно, то для пула потоков с 3 процессами_map_async()
создается 10 фрагментов по 5 элементов в каждом._number_left
затем представляет, сколько из этих фрагментов было выполнено.Я знаю, что это довольно старый вопрос, но вот что я делаю, когда хочу отслеживать прогресс пула задач в python.
По сути, вы используете apply_async с callbak (в этом случае он должен добавить возвращаемое значение в список), поэтому вам не нужно ждать, чтобы сделать что-то еще. Затем, в рамках цикла while, вы проверяете ход работы. В данном случае я добавил виджет, чтобы он выглядел лучше.
Выход:
Надеюсь, поможет.
источник
[pool.apply_async(my_function, (x,), callback=results.append) for x in dummy_args]
для(pool.apply_async(my_function, (x,), callback=results.append) for x in dummy_args)
Как предложил Тим, вы можете использовать
tqdm
иimap
для решения этой проблемы. Я только что наткнулся на эту проблему и настроилimap_unordered
решение, чтобы получить доступ к результатам сопоставления. Вот как это работает:Если вам не нужны значения, возвращаемые вашими заданиями, вам не нужно назначать список какой-либо переменной.
источник
для всех, кто ищет простое решение, работающее с
Pool.apply_async()
:источник
Я создал собственный класс для создания распечатки прогресса. Маби это помогает:
источник
Попробуйте этот простой подход на основе очередей, который также можно использовать с пулом. Помните, что печать чего-либо после запуска индикатора выполнения приведет к его перемещению, по крайней мере, для этого конкретного индикатора выполнения. (Прогресс PyPI 1.5)
источник