1. ホーム
  2. python

[解決済み] マルチプロセッシング : tqdm を使ってプログレスバーを表示する

2022-04-27 02:16:47

質問

私のコードをより "pythonic" で速くするために、私は "multiprocessing" と map 関数を使用して a) 関数と b) 反復の範囲を送信しています。

移植された解決策(すなわち、範囲 tqdm.tqdm(range(0, 30)) で直接 tqdm を呼び出す)は、マルチプロセシングでは動作しません(以下のコードで定式化されている通り)。

プログレスバーは0から100%まで表示されますが(pythonがコードを読むとき?)、map関数の実際の進行状況を示すものではありません。

map関数がどの段階にあるのかを示すプログレスバーを表示するには?

from multiprocessing import Pool
import tqdm
import time

def _foo(my_number):
   square = my_number * my_number
   time.sleep(1)
   return square 

if __name__ == '__main__':
   p = Pool(2)
   r = p.map(_foo, tqdm.tqdm(range(0, 30)))
   p.close()
   p.join()

どんなヘルプや提案も歓迎です...

解決方法は?

解決策発見 : 注意! マルチプロセッシングのため、推定時間(ループごとの繰り返し、合計時間など)が不安定になる可能性があるが、プログレスバーは完全に機能する。

注:Pool用コンテキスト・マネージャーはPythonバージョン3.3から利用可能です。

from multiprocessing import Pool
import time
from tqdm import *

def _foo(my_number):
   square = my_number * my_number
   time.sleep(1)
   return square 

if __name__ == '__main__':
    with Pool(processes=2) as p:
        max_ = 30
        with tqdm(total=max_) as pbar:
            for i, _ in enumerate(p.imap_unordered(_foo, range(0, max_))):
                pbar.update()