Реализация индикатора выполнения для вложенных дочерних процессов - PullRequest
0 голосов
/ 04 февраля 2019

Используя многопроцессорный модуль python, а точнее рабочие пулы, я делю большую задачу на n рабочих, которые, в свою очередь, могут снова разделить свою подзадачу на m (вспомогательных) работников.

Хотя обработка работает просто отлично, я не нашел хорошего способа сообщить о ходе работы пользователю.Я много смотрел на tqdm, но не нашел ничего, что не привело бы к горячему беспорядку прыгающих баров.

Вот рабочий пример (код основан на this связанный вопрос SO):

from tqdm import *
import time
import multiprocessing
import multiprocessing.pool

# adapted from https://stackoverflow.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: Было бы неплохо, если бы он не зависел от ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...