【问题标题】:progressbars inside multiprocessing calls overwriting each other on display多处理调用中的进度条在显示时相互覆盖
【发布时间】:2016-04-05 18:08:11
【问题描述】:

我正在使用进度条 3.6.2,但同时运行多个进度条时显示输出不正确。他们写在彼此的“顶部”。

这是一个最小的工作示例:

    import multiprocessing as mp
    import progressbar

    def run_many:
      p = mp.Pool(mp.cpu_count(), maxtasksperchild=1)
      results = p.map(run_one, args_list)
      p.close()
      p.join()

    def run_one:
       with progressbar.Progressbar(max_value=5000) as bar: 
           for i in range(5000):
               do_heavy_lifting(i)
               bar.update(i)

我得到一个行长的输出,但在看起来像

的东西之间振荡

30% (1500 of 5000) |#######------------| Elapsed Time: 0:00:39 Time: 0:00:39

29% (1400 of 5000) |######-------------| Elapsed Time: 0:00:39 Time: 0:00:39

因为每个线程异步更新自己的进度条。看起来它们只是在彼此之上显示。

在进入循环之前盲目地插入换行符不起作用(不足为奇);什么是更好的选择?

【问题讨论】:

    标签: python progress-bar command-line-interface python-multiprocessing


    【解决方案1】:

    发生这种情况是因为超过 1 个进程正在写入标准输出,因此它们会相互覆盖。

    你要做的是:

    1. 创建一个多处理队列results = mp.Queue()
    2. 从您的子进程中输入结果,例如results.put((mp.current_process(), status))
    3. 您必须从主进程读取此数据process_id, status = results.get()
    4. 显示每个进程的进度条

    这是我在编写多处理进度监视器时所依据的完美代码:Dynamic refresh printing of multiprocessing or multithreading in Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多