私はPythonプログラミングで質問があります。私はスレッドを持っているコードを書いています。このスレッドはブロックされたスレッドです。ブロックされたスレッドとは、スレッドがイベントを待っていることを意味します。イベントが設定されていない場合、このスレッドはイベントが設定されるまで待機する必要があります。ブロックスレッドは待ち時間なしにイベントを待たなければならないと私は期待しています!
ブロックされたスレッドを開始した後、カウンタを計算するために永遠のループを書きます。問題は:Ctrl + CでPythonプログラムを終了したいとき、ブロックされたスレッドを正しく終了できません。このスレッドはまだ生きています!私のコードはここにあります。Pythonブロックされたスレッド終了方法?
import threading
import time
def wait_for_event(e):
while True:
"""Wait for the event to be set before doing anything"""
e.wait()
e.clear()
print "In wait_for_event"
e = threading.Event()
t1 = threading.Thread(name='block',
target=wait_for_event,
args=(e,))
t1.start()
# Check t1 thread is alive or not
print "Before while True. t1 is alive: %s" % t1.is_alive()
counter = 0
while True:
try:
time.sleep(1)
counter = counter + 1
print "counter: %d " % counter
except KeyboardInterrupt:
print "In KeyboardInterrupt branch"
break
print "Out of while True"
# Check t1 thread is alive
print "After while True. t1 is alive: %s" % t1.is_alive()
出力:
$ python thread_test1.py
Before while True. t1 is alive: True
counter: 1
counter: 2
counter: 3
^CIn KeyboardInterrupt branch
Out of while True
After while True. t1 is alive: True
は、誰も私に助けを与えるだろうか?私は2つの質問をしたい。
1.ブロックされたスレッドをCtrl + Cで停止できますか?できるなら、実現可能な方向を教えてください。
2. PythonプログラムをCtrl + \ keyboardで停止するか、Pythonプログラムを実行しているハードウェア(例:PC)をリセットすると、ブロックされたスレッドは終了することができますか?
は、私はあなたに2つのより多くの質問をしてもらえますか?スレッド終了の経験はありません。私はまだ私が不明確になるので、ここで1番目の質問をします。第1の質問では、私は一時的に "メインスレッドを生かせよう"と無視します。 t1スレッドを 'daemon'とすると、Ctrl + Cを押すとまだ生きていますか?私は 'daemon'としてt1スレッドを作っていますが、' After while True 'はまだ見えます。 Ctrl + Cを押すと、t1は生きている:True'です。つまり、メインプログラムでも終了できますが、スレッドはまだ実行中です。これは正しいです? – jackbk
はい正しい...デーモンスレッドとして設定することで、それらを実行して忘れることができます。プログラムが終了すると、デーモンスレッドは自動的に強制終了されます。 –
ありがとうございます。私はあなたのデーモンスレッドの説明を理解しました。私の2番目の質問は、メインスレッドに対するあなたのコメントです: "メインスレッドがあなたのスレッドを開始したら、それには他に何もしません"、 "メインスレッドを生かしておきましょう"。私は 'KeyboardInterrupt'の例外を持つべきではないということを意味しましたか?ユーザがCtrl + Cを押すと私のpythonプログラムを終了させなければならないので、私は 'KeyboardInterrupt'の例外を使います。それは私の意図です。 – jackbk