join()
と呼ぶのが一番いいと思います スレッドが死ぬと予想されるときにスレッドで。私はあなたのループを終了するように自由に変更しました(そこに必要なクリーンアップの必要性を追加することもできます)。変数 die
各パスでチェックされ、True
のときにチェックされます 、プログラムは終了します。
import threading
import time
class MyThread (threading.Thread):
die = False
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run (self):
while not self.die:
time.sleep(1)
print (self.name)
def join(self):
self.die = True
super().join()
if __name__ == '__main__':
f = MyThread('first')
f.start()
s = MyThread('second')
s.start()
try:
while True:
time.sleep(2)
except KeyboardInterrupt:
f.join()
s.join()
KeyboardInterrupt とシグナルは、プロセス (つまり、メイン スレッド) によってのみ見られます... Ctrl-c を見てください。
Ctrl +C メインスレッドを終了しますが、スレッドはデーモンモードではないため、実行を続け、プロセスを存続させます。それらをデーモンにすることができます:
f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()
しかし、別の問題があります。メイン スレッドがスレッドを開始すると、他に何もすることがありません。そのため、終了し、スレッドは即座に破棄されます。それでは、メインスレッドを維持しましょう:
import time
while True:
time.sleep(1)
Ctrl を押すまで、'first' と 'second' を印刷し続けます。 +C .
編集: コメンターが指摘したように、デーモン スレッドは一時ファイルなどをクリーンアップする機会を得られない可能性があります。それが必要な場合は、KeyboardInterrupt
をキャッチしてください メインスレッドで、クリーンアップとシャットダウンを調整します。しかし、多くの場合、デーモン スレッドを突然終了させるだけで十分です。
@Thomas K の回答の改良版:
- アシスタント機能の定義
is_any_thread_alive()
この要点によると、main()
を終了できます
コード例:
import threading
def job1():
...
def job2():
...
def is_any_thread_alive(threads):
return True in [t.is_alive() for t in threads]
if __name__ == "__main__":
...
t1 = threading.Thread(target=job1,daemon=True)
t2 = threading.Thread(target=job2,daemon=True)
t1.start()
t2.start()
while is_any_thread_alive([t1,t2]):
time.sleep(0)