2017-05-01 2 views
0

Da ich mehrere Argumente in meine Arbeiter Funktion benötigen, so verwende ich starmap, aber wie kann ich zeigen den Fortschritt mit tqdm?Python Multiprocessing starmap progressBar

from itertools import repeat 
from multiprocessing import Pool 

def func(i, a, b, c): 
    print(i, a, b, c) 

if __name__ == '__main__': 
    pool = Pool(thread_num) 
    a, b, c = 'a', 'b', 'c' 
    pool.starmap(func, zip(range(100), repeat(a), repeat(b), repeat(c))) 
    pool.close() 
    pool.join() 

So wie kann ich Benutzer tqdm, um die Vorfreude zu zeigen?

+2

Ist es möglich, Ihre Funktion zu ändern, um ein einzelnes Tupelargument zu erhalten, anstatt mehrere? Das würde Sie "imap" anstelle von "starmap" ermöglichen, und so könnte der Hauptprozess die eingehenden Ergebnisse durchlaufen, um den Fortschrittsbalken zu aktualisieren. Leider gibt es keine Istarmap! Wenn Sie dies nur für eine Funktion tun müssen, die Sie nicht ändern können (z. B. aus einer Bibliothek), können Sie sie mit der Funktion 'def wrapper (tup): func (* tup)' umschließen, die auf der obersten Ebene definiert ist. – Blckknght

Antwort

0

Sie sollten einen Prozess erstellen, das Signal zu überwachen, indem sie andere Prozesse übergeben und Ihre tqdm zu aktualisieren. Ein minimales Beispiel für Sie:

from multiprocessing import Queue, Pool, Process 

def listener(q, num): 
    tbar = tdqm(total = num) 
    for i in iter(q.get, None): 
     tbar.update() 
    tbar.close() 

def worker(q): 
    do something. 
    queue.put(1) 

if __name__ == "__main__": 
    .... 
    q.put(None) #when you finish your work, put a None signal to finish the listener.