多处理中的progressbars调用在显示器上相互覆盖

时间:2016-04-05 18:08:12

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

我使用进度条3.6.2,同时运行多个进度条时显示输出不正确。他们写的是#34;在#34;彼此的。

这是一个最低限度的工作示例:

    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

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

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

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为有多个进程正在写入stdout,因此它们会相互覆盖。

你要做的是:

  1. 创建多处理队列results = mp.Queue()
  2. 从您的子进程中提取结果,例如results.put((mp.current_process(), status))
  3. 从主要流程中您必须阅读此数据process_id, status = results.get()
  4. 显示每个流程的进度条
  5. 以下是我编写多处理进度监视器时的完美代码:Dynamic refresh printing of multiprocessing or multithreading in Python