[英]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.