0

Ich benutze Fortschrittsbalken 3.6.2, und erhalten falsche Anzeige Ausgabe, wenn mehrere Fortschrittsbalken gleichzeitig ausgeführt werden. Sie schreiben "übereinander".Fortschrittsbalken in Multiprocessing-Aufrufen überschreiben einander auf dem Display

Hier ist ein Mindestarbeitsbeispiel:

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) 

ich Ausgabe, die eine Linie lang, aber oszilliert zwischen etwas, das

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

und

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

wie

aussieht

, da jeder Thread seinen eigenen Fortschrittsbalken asynchron aktualisiert. Es sieht so aus, als ob sie nur übereinander angezeigt werden.

Blindes Einfügen eines Zeilenumbrüche vor dem Einstieg in die Schleife funktioniert nicht (keine Überraschung); Was ist eine bessere Option?

Antwort

0

Dies passiert, weil mehr als ein Prozess in den stdout schreibt, also überschreiben sie sich gegenseitig.

Was haben Sie zu tun ist:

  1. eine Multiprocessing-Warteschlange führt results = mp.Queue()
  2. Feed schaffen es aus Ihrem Kind Prozesse wie results.put((mp.current_process(), status))
  3. aus dem Hauptprozess Sie diese Daten lesen process_id, status = results.get()
  4. anzeigen eines Fortschrittsbalkens für jeden Prozess

Hier ist ein perfekter Code, den ich beim Schreiben meines Multiprocessing-Fortschrittsmonitors zugrunde legte: Dynamic refresh printing of multiprocessing or multithreading in Python

Verwandte Themen