Posted at

Pythonでmultiprocessingを用いて並列実行するときに、プロセスそれぞれの進捗バーをtqdmで表示する


概要

Pythonでmultiprocessingを使って並列処理を実行するときに、それぞれのプロセス毎に進捗を表示したい時があるかと思います。

そこで、tqdm を用いてプロセス毎にバーを表示してみました。

参考 : tqdm


目標

プロセス毎に独立してプログレスバーを表示!

スクリーンショット 2019-05-29 17.16.13.png


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から始めています。


結果

レイアウトが崩れることなく、プログレスバーの表示、及びその後のprint出力もできています。

スクリーンショット 2019-05-29 17.17.04.png