チームAとチームBというスレッドで、並列処理を実行していきたいのですが上手くいきません。
teamAにはtanakakun,yoshidakunというメンバーがそれぞれいて、tanakakunの処理が終了してからyoshidakunを実行したいので、tanakunの処理にロックをかけて、終了したら開放しています。
ここまでは上手くいくのですが、同時にチームBも走らせて、tigerの処理が終了してからcatの処理を走らせたいのですが、tigerの処理がチームAのtanakakunの処理が終わるまで実行されません。
チームAというスレッドにかけたロックがチームBのスレッドにも影響している状況だと判断しています。
どのように、異なるスレッドに別々のロックをかければ良いのでしょうか。
python
1import threading 2import time 3import datetime 4 5lock = threading.Lock() 6 7def time_disp(): 8 dt_now = datetime.datetime.now() 9 # 書式化した時間と生の状態2つをタプル型で返す 10 return (f"{dt_now.hour}時:{dt_now.minute}分:{dt_now.second}秒", dt_now) 11 12def teamA(take_time=1,lock=lock): 13 print(take_time) 14 lock.acquire() 15 thread_name = threading.current_thread().getName() 16 start_time,startt = time_disp() 17 print(f"僕のスレッド名は {thread_name} です") 18 print(f"{start_time}::{thread_name}行きます.") 19 time.sleep(take_time) 20 finish_time,finisht = time_disp() 21 print(f"{finish_time}::{thread_name}フィニッシュ") 22 elapsed_time = finisht - startt 23 print(f"経過時間::{elapsed_time}") 24 lock.release() 25 26def teamB(take_time=1,lock=lock): 27 print(take_time) 28 lock.acquire() 29 thread_name = threading.current_thread().getName() 30 start_time,startt = time_disp() 31 print(f"僕のスレッド名は {thread_name} です") 32 print(f"{start_time}::{thread_name}行きます.") 33 time.sleep(take_time) 34 finish_time,finisht = time_disp() 35 print(f"{finish_time}::{thread_name}フィニッシュ") 36 elapsed_time = finisht - startt 37 print(f"経過時間::{elapsed_time}") 38 lock.release() 39 40if __name__ == '__main__': 41 print('よーいどん') 42 ## スレッドの引数はargsかkwargsで渡さないといけない。スレッド名はname=~で変更できる。 43 teamA1 = threading.Thread(target=teamA,kwargs={'take_time':5,'lock':lock},name="tanakakun") 44 teamA2 = threading.Thread(target=teamA,kwargs={'take_time':3},name="yoshidakun") 45 46 teamB1 = threading.Thread(target=teamB,kwargs={'take_time':2,'lock':lock},name="tiger") 47 teamB2 = threading.Thread(target=teamB,kwargs={'take_time':9},name="cat") 48 49 teamA1.start() 50 teamB1.start() 51 52 print("match") 53 teamA2.start() 54 55 teamB2.start() 56 57 ## joinでスレッド処理が終了するのを待つ 58 59 teamA1.join 60 teamB1.join() 61 teamA2.join() 62 teamB2.join() 63 print("競争終了!!!!") 64
実行結果
よーいどん 5 僕のスレッド名は tanakakun です 10時:31分:54秒::tanakakun行きます. 2 match 3 9 10時:31分:59秒::tanakakunフィニッシュ 経過時間::0:00:05.012617 僕のスレッド名は tiger です 10時:31分:59秒::tiger行きます. 10時:32分:1秒::tigerフィニッシュ 経過時間::0:00:02.005220 僕のスレッド名は yoshidakun です 10時:32分:1秒::yoshidakun行きます. 10時:32分:4秒::yoshidakunフィニッシュ 経過時間::0:00:03.012514 僕のスレッド名は cat です 10時:32分:4秒::cat行きます. 10時:32分:13秒::catフィニッシュ 経過時間::0:00:09.011031 競争終了!!!!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/12 06:28