【问题标题】:apply progress bar to multiprocessing.Pool(threads).apply(function)将进度条应用于 multiprocessing.Pool(threads).apply(function)
【发布时间】:2021-09-22 11:20:17
【问题描述】:

我想为没有要传递的参数的函数应用多处理池的进度条。 (将进度条应用到 multiprocessing.Pool(threads).apply(function) )

accounts = []
def a():
    for account in accounts:
      while True:
         try:
             #tasks
         exept:
             continue
         break

def main():
    threads = int(input('Enter Threads: '))
    p= multiprocessing.Pool(threads)
    p.apply(a)

if __name__ == '__main__':
    main()

所以我想在一个进度条中查看所有线程中的帐户进度!

【问题讨论】:

    标签: python multiprocessing progress-bar


    【解决方案1】:

    您当前的代码没有执行任何类型的多线程,因为 apply 方法会阻塞,直到 a 完成处理。此外,a 正在逐个处理accounts 的每个元素,而您真正想要做的是根据池中有多少线程并行处理accounts 的元素。

    在下面的代码中,函数a 现在只处理一个帐户。主进程调用方法apply_async,该方法不会阻塞,为accounts 列表中的每个元素指定一个回调 函数,当a 完成处理并返回结果时(它隐式返回None)。这个回调函数只是将进度条前进一个单位。

    from multiprocessing.pool import ThreadPool
    import tqdm
    
    def a(account):
        """ process account """
        import time
        # simulate doing something
        time.sleep(.5)
    
    def update_progress_bar(result):
        # result is return code from a, which is None
        progress_bar.update(1) # one more task completed
    
    def main():
        global progress_bar
        accounts = [1,2,3,4,5,6,7,8,9,10,11,12]
        num_threads = int(input('Enter number of threads: '))
        p = ThreadPool(num_threads)
        with tqdm.tqdm(total=len(accounts)) as progress_bar:
            for account in accounts:
                p.apply_async(a, args=(account,), callback=update_progress_bar)
            # wait for all submitted tasks to complete:
            p.close()
            p.join()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

    • -我真正想要的是线程而不是处理(对不起我的解释失误)-当 a() 中的帐户出于任何原因提出期望时,我想重试它,直到它与所有您在代码之前所做的漂亮更正非常有用且非常清晰,作为初学者,我从中学到了很多东西。非常感谢
    • 您发布的问题在实际代码中使用了多处理。因为这就是multiprocessing.Pool 给你的。无论如何,我已经更新了使用多线程的问题,并且代码的组织方式是并发处理帐户所需的方式,否则创建线程池有什么意义?也就是说,函数a 处理单个帐户,这是传递给它的参数。随意添加任何错误处理和重试逻辑。好像你一开始就没有任何真正的错误处理。
    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2010-12-21
    • 2019-07-09
    相关资源
    最近更新 更多