Um meinen Code "pythonischer" und schneller zu machen, verwende ich "Multiprocessing" und eine Kartenfunktion, um ihn a) die Funktion und b) den Bereich der Iterationen zu senden.
Die implantierte Lösung (dh tqdm direkt im Bereich tqdm.tqdm (Bereich (0, 30)) aufrufen) funktioniert nicht mit Multiprocessing (wie im folgenden Code formuliert).
Der Fortschrittsbalken wird von 0 bis 100% angezeigt (wenn Python den Code liest?), Zeigt jedoch nicht den tatsächlichen Fortschritt der Kartenfunktion an.
Wie kann ein Fortschrittsbalken angezeigt werden, der angibt, in welchem Schritt sich die Kartenfunktion befindet?
from multiprocessing import Pool
import tqdm
import time
def _foo(my_number):
square = my_number * my_number
time.sleep(1)
return square
if __name__ == '__main__':
p = Pool(2)
r = p.map(_foo, tqdm.tqdm(range(0, 30)))
p.close()
p.join()
Jede Hilfe oder Anregungen sind willkommen ...
.starmap()
: Hier ist ein Patch zumPool
Hinzufügen.istarmap()
, der auch funktionierttqdm
.Antworten:
Verwenden Sie imap anstelle von map, wodurch ein Iterator für verarbeitete Werte zurückgegeben wird.
quelle
starmap()
?for i in tqdm.tqdm(...): pass
kann einlist(tqdm.tqdm)
chunk_size
vonp.imap
. Kanntqdm
jede Iteration anstelle jedes Blocks aktualisiert werden?Lösung gefunden: Seien Sie vorsichtig! Aufgrund der Mehrfachverarbeitung kann die Schätzzeit (Iteration pro Schleife, Gesamtzeit usw.) instabil sein, aber der Fortschrittsbalken funktioniert einwandfrei.
Hinweis: Der Kontextmanager für Pool ist nur ab Python Version 3.3 verfügbar
quelle
pbar.close()
nicht erforderlich, wird es automatisch bei Beendigung vonwith
tqdm
Anruf notwendig?starmap()
?imap_unordered
ist hier der Schlüssel, es bietet die beste Leistung und die besten Schätzungen für den Fortschrittsbalken.Sie können
p_tqdm
stattdessen verwenden.https://github.com/swansonk14/p_tqdm
quelle
pip install
. Dies ersetzt tqdm für die meisten meiner Bedürfnissep_tqdm
ist beschränkt aufmultiprocessing.Pool
, nicht verfügbar für ThreadsEs tut uns leid, dass Sie zu spät kommen, aber wenn Sie nur eine gleichzeitige Karte benötigen, ist in der neuesten Version (
tqdm>=4.42.0
) jetzt Folgendes integriert:Verweise: https://tqdm.github.io/docs/contrib.concurrent/ und https://github.com/tqdm/tqdm/blob/master/examples/parallel_bars.py
quelle
HBox(children=(FloatProgress(value=0.0, max=30.0), HTML(value='')))
JupyterBasierend auf der Antwort von Xavi Martínez habe ich die Funktion geschrieben
imap_unordered_bar
. Es kann auf die gleiche Weise verwendet werden,imap_unordered
mit dem einzigen Unterschied, dass eine Verarbeitungsleiste angezeigt wird.quelle
quelle
Hier ist meine Einstellung, wann Sie Ergebnisse von Ihren parallel ausgeführten Funktionen zurückerhalten müssen. Diese Funktion erledigt einige Dinge (es gibt einen anderen Beitrag von mir, der dies weiter erklärt), aber der entscheidende Punkt ist, dass eine Warteschlange für anstehende Aufgaben und eine Warteschlange für abgeschlossene Aufgaben vorhanden ist. Wenn die Mitarbeiter mit jeder Aufgabe in der ausstehenden Warteschlange fertig sind, fügen sie die Ergebnisse in die Warteschlange für abgeschlossene Aufgaben ein. Sie können die Prüfung mit der Fortschrittsanzeige tqdm in die Warteschlange für abgeschlossene Aufgaben einschließen. Ich stelle die Implementierung der Funktion do_work () hier nicht ein, sie ist nicht relevant, da hier die Meldung lautet, dass die Warteschlange für abgeschlossene Aufgaben überwacht und der Fortschrittsbalken jedes Mal aktualisiert werden soll, wenn ein Ergebnis vorliegt.
quelle
Dieser Ansatz ist einfach und funktioniert.
quelle