我在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
进度条,它们存在于独立于主进程的进程中。我不确定解决办法是什么,让它们像我预期的那样运行,因为我有几个进度条,每个进度条都在更新。
我通过以下方式构建计算获得了良好的结果:
with multiprocessing.Pool() as p:
list(tqdm.tqdm(p.imap_unordered(inserter, tasks), total=len(tasks)))
这为所有任务提供了一个统一的进度条。
如果您正在使用PyCharm,那么在运行/调试配置中启用Emulate terminal in output console
可能会有所帮助。至少它对我有效。这个解决方案是在搜索了几个小时后在这个线程上找到的。
为了澄清,我遇到了同样的";进度条跳来跳去";除了我使用多线程外,其他问题都和你一样。在每个线程中,都有一个循环会运行很长一段时间,我想分别显示每个循环的进度。
这个问题在他们的常见问题解答中(在"嵌套进度条"下(。只是碰巧我触发它的方式没有列在那里。