首页 > 解决方案 > 将进度条应用于 multiprocessing.Pool(threads).apply(function)

问题描述

我想为没有要传递的参数的函数应用多处理池的进度条。(将进度条应用于 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()

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

标签: pythonmultiprocessingprogress-bar

解决方案


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

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

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()

推荐阅读