0

Я использую progressar 3.6.2 и получаю неправильный вывод на дисплей при одновременном запуске нескольких передовых панелей. Они пишут «сверху» друг друга.progressbars внутри многопроцессорных вызовов переписывают друг друга на дисплее

Вот минимальный рабочий пример:

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

как каждый поток обновляет свой собственный индикатор выполнения асинхронно. Похоже, они просто показывают друг на друга.

Слегка вставлять разрыв линии перед входом в петлю не работает (не удивительно); что лучше?

ответ

0

Это происходит потому, что более 1 процесс записывает на стандартный вывод, поэтому они перезаписывают друг друга.

То, что вы должны сделать, это:

  1. создать очередь MultiProcessing 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