2017-05-01 45 views
0

私はワーカー関数でいくつかのargsが必要なので、私はstarmapを使いますが、どのように進捗状況をtqdmで表示できますか?pythonマルチプロセッシングstarmapプログレスバー

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() 

私はどのようにしてtqdmにプレビューを表示できますか?

+2

いくつかの引数ではなく1つのタプル引数を受け取るように関数を変更することはできますか?そうすれば 'starmap'の代わりに' imap'ができるようになります。そのため、メインプロセスは入ってくる結果をループしてプログレスバーを更新することができます。残念ながら、istarmapはありません!あなたが変更できない関数(ライブラリからのものなど)に対してのみこれを行う必要がある場合は、トップレベルで定義された 'def wrapper(tup):func(* tup)'関数でラップすることができます。 – Blckknght

答えて

0

他のプロセスから渡されたシグナルを監視し、tqdmを更新するプロセスを作成する必要があります。あなたのための最小の例:

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. 
関連する問題