0

複数のプログレスバーを同時に実行しているときにプログレスバー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

のようなものとの間で振動出力を得ます

それぞれのスレッドが独自のプログレスバーを非同期に更新するためです。彼らはちょうどお互いの上に表示されているように見えます。

ループに入る前に盲目的に挿入してもうまくいきません(驚きはありません)。何が良い選択肢ですか?

答えて

0

これは、2つ以上のプロセスがstdoutに書き込んでいるために発生しているため、互いに上書きします。

何がしなければならないことである。

  1. results = mp.Queue()
  2. それはあなたがこのデータを読み込む必要がメインプロセスprocess_id, status = results.get()
  3. から results.put((mp.current_process(), status))
  4. のようなあなたの子プロセスの中から得られるフィードマルチプロセッシングキューを作成
  5. 各プロセスの進行状況バーを表示

ここでは、マルチプロセッシングの進捗状況モニターを作成するときに基づいている完全なコードを示します。Dynamic refresh printing of multiprocessing or multithreading in Python

関連する問題