0

私は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)をリセットすると、ブロックされたスレッドは終了することができますか?

答えて

1

Ctrl + Cは、メインスレッドのみを停止します。スレッドはdaemonモードではありません。そのため、プロセスが動作し続けるのはそのためです。最初にあなたのスレッドをデーモンにしてください。

t1 = threading.Thread(name='block', 
         target=wait_for_event, 
         args=(e,)) 
t1.daemon = True 
t1.start() 

他のスレッドと同様です。しかし、別の問題があります。メインスレッドがあなたのスレッドを開始したら、それにはそれ以外のことはありません。だから、それは終了し、糸は即座に破壊されます。それでは、生きているメインスレッドを維持してみましょう:this見て

import time 
while True: 
    time.sleep(1) 

してください、私はあなたの他の回答を得ることを願っています。

+0

は、私はあなたに2つのより多くの質問をしてもらえますか?スレッド終了の経験はありません。私はまだ私が不明確になるので、ここで1番目の質問をします。第1の質問では、私は一時的に "メインスレッドを生かせよう"と無視します。 t1スレッドを 'daemon'とすると、Ctrl + Cを押すとまだ生きていますか?私は 'daemon'としてt1スレッドを作っていますが、' After while True 'はまだ見えます。 Ctrl + Cを押すと、t1は生きている:True'です。つまり、メインプログラムでも終了できますが、スレッドはまだ実行中です。これは正しいです? – jackbk

+0

はい正しい...デーモンスレッドとして設定することで、それらを実行して忘れることができます。プログラムが終了すると、デーモンスレッドは自動的に強制終了されます。 –

+0

ありがとうございます。私はあなたのデーモンスレッドの説明を理解しました。私の2番目の質問は、メインスレッドに対するあなたのコメントです: "メインスレッドがあなたのスレッドを開始したら、それには他に何もしません"、 "メインスレッドを生かしておきましょう"。私は 'KeyboardInterrupt'の例外を持つべきではないということを意味しましたか?ユーザがCtrl + Cを押すと私のpythonプログラムを終了させなければならないので、私は 'KeyboardInterrupt'の例外を使います。それは私の意図です。 – jackbk

1

実行中のすべてのpythonのプロセスを強制終了する必要がある場合は、単にコマンドラインからpkill pythonを実行するだけです。 これは少し極端ですが、うまくいくでしょう。

他のソリューションは、あなたのコード内のロックを使用することですhere次を参照してください。

+0

ありがとうございます。私はCtrl + CまたはCtrl + \でプログラムを殺すべきではないと思う。 Pythonプログラムを停止するのは良い方法ではありません。しかし、PythonプログラムをCtrl + CまたはCtrl + \で殺すとスレッドが実行されるのは本当に興味があります。だから私はこのトピックでこの問題を尋ねました。 "ロック"については、これまでに読んだことがありますが、私はこの方法に慣れていません。私はSystemCの "event waiting"に精通しているので、Pythonで同じメソッド(イベント待ち)を試してみました。これは、私の例では "イベント待機"でブロッキングスレッドを使用する理由です。 – jackbk

関連する問題