繁体   English   中英

使用 Python 多处理时显示 tqdm 进度条

[英]Showing tqdm progress bar while using Python multiprocessing

我正在尝试使用 Python 的multiprocessing库运行一些计算量很大的任务,并且我想为每个工作人员显示一个 tqdm 进度条。 具体来说,我希望为multiprocessing.Process工作人员或multiprocessing.Pool工作人员提供此功能。

我知道有关此主题的类似 StackOverflow 问题(参见例如(1) 多处理:使用 tqdm 显示进度条,(2) 显示 Python 多处理池 imap_unordered 调用的进度? ,(3) tqdm 进度条和多处理) 但他们似乎都对在所有工作人员中显示一个进度条感兴趣。 我想为每个工人显示一个进度条。

这是一个示例 function,代替了我计算量大的 function 我想多进程:

from tqdm import notebook
import time
def foo2(id):
    total = 100
    with notebook.tqdm(total=total, position=id) as pbar:
        for _ in range(0, total, 5):
            pbar.update(5)
            time.sleep(0.1)

当我依次尝试时,我得到了预期的结果:5 个进度条一个接一个地填满。

但是,当我尝试使用multiprocessing执行此操作时,我得到了所需的加速,但没有显示进度条。 无论我使用Pool工作人员还是Process工作人员,这都是正确的。 这是我的示例代码:

%%time
from multiprocessing import Pool
pool = Pool(5)
pool.map(foo2, range(5))
pool.close()
pool.join()

池 - 没有进度条

根据这里的评论( https://github.com/tqdm/tqdm/issues/407#issuecomment-322932800 ),我尝试使用几个ThreadPool工作人员,奇怪的是这能够产生进度条。 但是,对于我的情况,我更喜欢使用带有进度条的PoolProcess工作人员。

%%time
from multiprocessing.pool import ThreadPool
pool = ThreadPool(5)
pool.map(foo2, range(5))
pool.close()
pool.join()

ThreadPool - 进度条显示!

希望有人可以帮助我。 我已经尝试了几乎所有我能想到的东西。 作为参考,我使用的是 Python 3.7.7和 tq 4.57.0

在 github 主页面上搜索tqdm的问题帖子,我发现了一个对我有用的黑客,但它绝对感觉像是一个“黑客”而不是真正的问题修复: https://github.com/tqdm/tqdm/issues /485#issuecomment-473338308

新的(工作)代码如下所示:

from tqdm import notebook
import time
def foo2(id):
    total = 100
    print(' ', end='', flush=True)
    for _ in notebook.tqdm(range(0, total, 5)):
        time.sleep(0.1)

%%time
pool = Pool(5)
#pool.map(foo2, range(5)) # this also works fine with the new hack
for i in range(5):
    pool.apply_async(foo2, args=(i,))
pool.close()
pool.join()

我不知道这个问题是否仍然相关,但您可以使用parallelbar库轻松完成。 这是一个简单的例子

#pip install parallelbar
from parallelbar import progress_map
from math import radians, sin, cos

# toys example of computationally expensive function 
def cpu_bench(number):
    product = 1.0
    for elem in range(number):
        angle = radians(elem)
        product *= sin(angle)**2 + cos(angle)**2
    return product

if __name__=='__main__':
    tasks = [1000000 + i for i in range(100)]
    result = progress_map(cpu_bench, tasks, n_cpu=4, chunk_size=1, core_progress=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM