Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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

結果

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away