簡體   English   中英

Python多處理和進度條功能有時會掛起

[英]Python multiprocessing and progress bar function occasionally hangs

我具有用於運行許多不同操作的通用功能,這些操作可啟動多個進程,然后使用progressbar2模塊跟蹤進度。 有時進度條會導致掛斷,並且功能會卡住。 我似乎無法弄清楚為什么,如果刪除進度條更新,則過程完成並繼續進行,因此問題似乎出在while循環中。 有沒有更好的方法來構造while循環?

def runMultiProgress(function, inputList, cpus):
    from progressbar import ProgressBar, Percentage, ETA
    from time import sleep
    #setup pool
    p = multiprocessing.Pool(cpus)
    #setup progress bar
    widgets = ['     Progress: ', Percentage(),' || ', ETA()]
    pbar = ProgressBar(widgets=widgets, term_width=30, maxval=len(inputList)).start()
    #setup results and split over cpus
    results = []
    r = [p.apply_async(function, (x,), callback=results.append) for x in inputList]
    #refresh pbar every 5 seconds
    while len(results) != len(inputList):
        pbar.update(len(results))
        sleep(5)
    pbar.finish()
    p.close()
    p.join()

更新:援引我的資料,這個多處理+進度欄來自@ julien-tourille答案在這里: 顯示Python多處理池映射調用的進度?

我最終修改了該函數以僅使用一個簡單的進度欄,並修改了如何調用多處理。 這似乎更簡單,並且對我有用。

def runMultiProgress(function, inputList, cpus):
    #setup pool
    p = multiprocessing.Pool(cpus)
    #setup results and split over cpus
    tasks = len(inputList)
    results = []
    for i in inputList:
        results.append(p.apply_async(function, [i]))
    #refresh progress every sec
    while True:
        incomplete_count = sum(1 for x in results if not x.ready())
        if incomplete_count == 0:
            break
        sys.stdout.write("Progress: %.2f%% \r" % (float(tasks - incomplete_count) / tasks * 100))
        sys.stdout.flush()
        time.sleep(1)
    p.close()
    p.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM