Реализация индикатора выполнения для вложенных дочерних процессов
Используя многопроцессорный модуль python, а точнее рабочие пулы, я делю большую задачу на n
рабочие, которые в свою очередь могут снова разделить свою подзадачу на m
(суб) работников.
Хотя обработка работает просто отлично, я не нашел хорошего способа сообщить о ходе работы пользователю. Я много смотрел на tqdm
, но не нашел ничего, что не привело бы к горячему беспорядку прыгающих баров.
Вот рабочий пример (код основан на этом связанном вопросе SO):
from tqdm import *
import time
import multiprocessing
import multiprocessing.pool
# adapted from https://stackru.com/questions/17223301/python-multiprocessing-is-it-possible-to-have-a-pool-inside-of-a-pool/17229030#17229030
class NoDaemonProcess(multiprocessing.Process):
# make 'daemon' attribute always return False
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
class Pool(multiprocessing.pool.Pool):
Process = NoDaemonProcess
def _foo(my_number):
## process indication
#print(f'Process {multiprocessing.current_process()}: {my_number}')
square = my_number * my_number
time.sleep(1)
return square
def wfun(x):
with Pool(2) as p2:
p2.map(_foo,x)
'''
with tqdm(total=len(x)) as pbar:
for i, _ in tqdm(enumerate(p2.imap_unordered(_foo, x))):
pbar.update()
'''
if __name__ == '__main__':
with Pool(2) as p:
itlist = [range(0,30),range(30,80)]
p.map(wfun,itlist)
'''
with tqdm(total=2) as pbar:
for i, _ in tqdm(enumerate(p.imap_unordered(wfun,itlist))):
pbar.update()
'''
Код с комментариями - это просто простая реализация tqdm
, Если я использую его только в __name__ == '__main__':
блок, прирост информации не так уж велик, так как он будет прыгать прямо до 50%, когда первый работник заканчивает работу. Когда я добавляю все или только столбики в wfun
, это начинает становиться немного запутанным.
В идеале, я бы хотел отдельную планку для каждого процесса первого пула, чтобы они не прыгали вокруг консоли. Пока не могу понять.
PS: Было бы неплохо, если бы это не зависело от ОС.