2017-05-01 204 views
0

由於我需要在我的工作者函數中有幾個參數,所以我使用starmap,但是如何使用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() 

那麼我如何使用tqdm來顯示pregress?

+2

是否有可能改變你的函數接收單個元組參數而不是幾個?這會讓你'imap'而不是'starmap',所以主進程可以循環傳入結果來更新進度條。不幸的是,沒有'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. 
相關問題