使用tqdm和多进程

5

我正在使用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个回答

4
我通过这种方式来构建计算,取得了良好的结果:

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

这为您提供了一个单一的、统一的进度条来显示所有任务的进度。


0

如果您正在使用PyCharm,则在运行/调试配置中启用在输出控制台中模拟终端可能会有所帮助。至少对我有效。在搜索了几个小时后,我在this线程上找到了这个解决方案。

为了澄清,我遇到了与您相同的“进度条跳动”问题,只不过我正在使用多线程。在每个线程中,都有一个运行相当长时间的循环,并且我想分别显示每个循环的进度。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接