将tqdm与多处理配合使用

时间:2019-10-25 14:41:13

标签: python multiprocessing tqdm

我正在Python 3.7中使用多重处理来启动几个长期运行的操作。每个单独的过程都需要花费几分钟才能完成。我想要同时显示正在运行的每个单个进程的进度条。我一直很难做到这一点,因为进度条一直在不停地跳来跳去,并且在我目前的徒劳尝试中彼此替代。

我这样创建流程:

with Pool(processes=cpu_count()) as pool:
    return pool.starmap(_execute_long_running_process, items)

我的_execute_long_running_process函数内部是一个for循环,我希望进度条能够跟踪该循环。

for i in tqdm(list_of_things_to_process, leave=False):
    # do a thing

我认为我的问题来自于其自己的流程(与主要流程)分开存在的每个tqdm进度条。我不确定要使它们像我预期的那样在我有几个进度条的地方进行更新的解决方法。

2 个答案:

答案 0 :(得分:0)

通过以这种方式构造计算,我获得了良好的结果:

    with multiprocessing.Pool() as p:
        list(tqdm.tqdm(p.imap_unordered(inserter, tasks), total=len(tasks)))

这为您提供了一个统一的所有进度条。

答案 1 :(得分:0)

如果您使用的是 PyCharm,那么在运行/调试配置中启用 Emulate terminal in output console 可能会有所帮助。至少它对我有用。搜索数小时后,在 this 线程上找到了此解决方案。

澄清一下,除了我使用的是多线程之外,我遇到了与您相同的“进度条跳转”问题。每个线程中都有一个循环运行了很长时间,我想分别显示每个循环的进度。

这个问题在他们的 FAQ 中(在“嵌套进度条”下)。碰巧我触发它的方式没有列在那里。