Pythonのスレッドで待ち合わせをしてみよう
今回はスレッドのjoin()を使って待ち合わせをしてみましょう。
前回のプログラムでは、二つのスレッドを同時に実行させていましたが、今回は最初のスレッドが終了してから2番目のスレッドを動かします。
スレッドを待ち合わせる
スレッドの待ち合わせをするには、join()メソッドを使用します。
オブジェクト名.join()
スレッドの待ち合わせをするプログラム
スレッドの待ち合わせをするプログラムは、以下のようになります。
スレッドにnameオプションで、それぞれ thread1、thread2 という名前を付けます。
13行目の threading.current_thread().name で現在のスレッドの名前を取得できます。
thread2 の場合は、if文の中に入り thread1.join() とすることで thread2 は thread1 が終了するまで待つことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
### インポート import time import tkinter import threading ### 関数 def func(num, gap, pos_x, pos_y): ### 変数宣言 cnt = 0 ### スレッド待ち合わせ if threading.current_thread().name == "thread2": thread1.join() ### 10未満の間ループ while cnt < 10: ### カウントアップ cnt += num ### キャンバス書き込み id = canvas.create_text(pos_x, pos_y, text=cnt, font=(None,48)) ### 待ち時間 time.sleep(gap) ### キャンバス初期化 canvas.delete(id) ### キャンバス作成 canvas = tkinter.Canvas(master=None, width=420, height=200) ### キャンバス表示 canvas.pack() ### スレッド作成 thread1 = threading.Thread(target=func, args=(1,1,140,100), name="thread1", daemon=True) thread2 = threading.Thread(target=func, args=(2,2,280,100), name="thread2", daemon=True) ### スレッド開始 thread1.start() thread2.start() ### イベントループ canvas.mainloop() |
プログラムを実行すると、左側の表示が終わるのを待ち、右側の表示が開始されます。