LoginSignup
48
29

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-29

概要

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

(追記) positionの挙動については、OSや実行時環境により挙動が異なるようです。この辺り、position=p にするのか position=p+1 にするのかは実際に試してみて綺麗に動くほうを採用するのがよいかと思われます。

結果

レイアウトが崩れることなく、プログレスバーの表示、及びその後のprint出力もできています。
スクリーンショット 2019-05-29 17.17.04.png

48
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
29