为嵌套的子进程实现进度条

时间:2019-02-04 12:27:07

标签: python multiprocessing progress-bar tqdm

使用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:如果它与操作系统无关,那就太好了。

0 个答案:

没有答案