2016-12-17 35 views
0

私は、複数のプロセスを起動してprogressbar2モジュールを使用して進捗状況を追跡するためにさまざまな操作を実行する一般的な機能を持っています。プログレスバーがハングアップして機能が停止することがあります。私はなぜ、私が進行状況バーの更新を削除すると、プロセスが終了し、移動するので、問題がwhileループにあるように見える理由を理解できないようです。 whileループを構築するより良い方法はありますか?Pythonのマルチプロセッシングとプログレスバーの機能がハングアップすることがある

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

UPDATE:私の情報源を引用し、このマルチプロセッシング+プログレスバーがここに@ジュリアン・tourilleの答えからです:Show the progress of a Python multiprocessing pool map call?

答えて

0

私は単純なプログレスバーを使用するために機能を変更することになったとマルチプロセッシングがいかに修正呼び出されています。これはより簡単で、私のために働くようです。

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