概要
Pythonでmultiprocessingを使って並列処理を実行するときに、それぞれのプロセス毎に進捗を表示したい時があるかと思います。
そこで、tqdm を用いてプロセス毎にバーを表示してみました。
参考 : tqdm
目標
Code
from time import sleep
import random
from tqdm import tqdm
from multiprocessing import Pool, freeze_support, RLock
L = 8
def long_time_process(p):
info = f'#{p:>2} ' # 進捗バーの左側に表示される文字列
for _ in tqdm(range(20), desc=info, position=p+1):
sleep(random.random())
return p * 2
if __name__ == '__main__':
freeze_support() # Windows のみ必要
with Pool(L,
# Windows のみ必要
initializer=tqdm.set_lock, initargs=(RLock(),)) as p:
result = p.map(long_time_process, range(L))
print("\n" * L) # tqdm終了後のカーソル位置を最下部に持ってくる
print(result)
解説
long_time_process
: 並列実行したい関数
freeze_support, initializer, initargs
: Windowsでのみ必要になるそうです。Macではこれを省いても特に問題ありませんでした。
position=p+1
: 本来はpositionは0から始まるため、画像を見るとわかるように、プログラムを実行したときに上に1行分のスペースができています。position=0から表示させると、一番上のプログレスバーが終了したタイミングで全体の表示がずれてしまうため、ここでは1から始めています。
(追記) positionの挙動については、OSや実行時環境により挙動が異なるようです。この辺り、position=p
にするのか position=p+1
にするのかは実際に試してみて綺麗に動くほうを採用するのがよいかと思われます。