【问题标题】:Using tqdm with multiprocessing将 tqdm 与多处理一起使用
【发布时间】:2019-10-25 14:41:13
【问题描述】:

我在 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 进度条存在于其自己的进程中,与主进程分开。我不确定有什么解决方法可以让它们按我预期的方式运行,我有几个进度条正在更新。

【问题讨论】:

    标签: python multiprocessing tqdm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 2021-05-22
        • 2012-03-04
        • 1970-01-01
        • 2018-03-10
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多