前提
Pythonで2つのクラスを作成し,そのうちの一つをマルチスレッドで起動させるというテストコードがあります。Test1をマルチスレッドとして,ずっと1を出力しています。
そしてinput()で適当なタイミングで入力すると,Test2のstop関数を呼び出して,2を表示したあとに一旦yield でその関数を中断し,そのあとTest.join()でマルチスレッドを止めます。
その後,再度input()で適当なタイミングで入力すると,Test2.stop()が途中から開始されて,4が表示され,yield で中断してmainのwhile文の上に戻ると思っています。
つまり,このコードで期待される動きは大体次のようなものであると思っています。(join()するときに2と4の間に1が出るかでないかは分からないですが,大体このようなものという想定です)
期待される出力
1 1 1 1 1 1 1 ←ここでinput()を入れる 2 (ここでTest1.join()でマルチスレッドを閉じる = 1の出力が止まる) ←ここでinput()を入れる 4 1(whileループの上に戻る) 1 1 1 1 1
問題点
しかし,このような出力にはなりません。
実行すると,常に1が表示され,2が表示されません。というか,Test2.stop()が呼び出されていません。
しかし,Test2.stop()内のyieldをコメントアウトすると,Test2.stop()が呼び出されて2が表示されます。(当然この場合2と4が順繰りに永遠表示され続けますが.)
質問したいのは,なぜマルチスレッドで裏で何かのクラスを起動させている際に.他の,関数内にyieldを含んでいる関数を呼び出すと,その関数が呼び出されないのかということです。
現在マルチスレッドを勉強していて,このようなコードを書くとどうなるのだろうと思って書いてみたら,想定通りの動作にならずに理由が全く分からなかったので質問させて頂きました。
該当のソースコード
python
1import cv2 2import threading 3from threading import Thread 4 5class Test1(threading.Thread): 6 def run(self): 7 while True: 8 print(1) 9 cv2.waitKey(500) 10class Test2: 11 def stop(self): 12 while True: 13 print(2) 14 yield 3 15 print(4) 16 yield 5 17 18if __name__ == '__main__': 19 test1 = Test1() 20 test2 = Test2() 21 while True: 22 test1.start() 23 input() 24 test2.stop() 25 test1.join() 26 input() 27 test2.stop()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/11 12:12
2020/11/11 15:28 編集
2020/11/11 15:38