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

2024-04-27 17:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我知道关于这个主题也有类似的StackOverflow问题(例如,见(1)Multiprocessing : use tqdm to display a progress bar,(2)Show the progress of a Python multiprocessing pool imap_unordered call?,(3)tqdm progress bar and multiprocessing),但他们似乎都对在所有员工中显示一个进度条感兴趣。我想为每个工人显示一个进度条

下面是一个示例函数,它取代了我希望进行多处理的计算量大的函数:

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

Pool - no progress bars

根据这里的评论(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 - progress bars show!

希望有人能帮我。我已经尝试了我能想到的一切。作为参考,我使用Python3.7.7和tqdm4.57.0


Tags: 进度条fromimporttimerangemultiprocessingprocesstotal
1条回答
网友
1楼 · 发布于 2024-04-27 17:52:47

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

相关问题 更多 >