2017-01-30 13 views
0

私はユーザーの中断後にスレッドを停止することを検討していましたが、何らかの理由でそれが機能しません。誰も助けることができます。問題は、プログラムがキーボード割り込みエラーを無視するだけで、キーボード割り込み後にはシャットダウンしないということです。threading.event関数を使用してスレッドを削除するにはどうすればよいですか?

#!/usr/bin/env python 
# 
# 
from time import sleep 
from Queue import Queue 
from threading import Thread,Event,Lock 

def Count(): 
    global Exit 
    for i in range(5): 
    try: 
    if not Exit.is_set(): 
    with l: 
     print i;sleep(2) 
    except KeyboardInterrupt: 
    Exit.set() 

if __name__ == '__main__': 
    l = Lock() 
    q = Queue() 

    Exit = Event() 

    for i in range(2): 
    Bot = Thread(target=(Count)).start() 
    q.put(Bot) 

    #q.join() 


#OutPut 

0 
1 
^C2 
3 
4 
0 
Exception KeyboardInterrupt in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored 
+1

あなたはエラーと予想される動作が何であるかを共有することはできますか? – Fejs

答えて

0

達成しようとしていることは完全には明確ではありません。だからあなたのコードを再構築しました。

  1. 私はあなたのものを入れていたが、何かを取っていないキューを削除しました。
  2. 複数のスレッドから呼び出されていないロックを削除し、スリープの周りでロックを保持していた状態が悪かった。
  3. 私はメインループの終わりに、空ではないキューに参加するのではなく、スレッドに参加します。
  4. 最後に、私はすべてのスレッドでキーボード割り込みをチェックします。

from time import sleep 
from threading import Thread, Event 

def count(): 
    global exit_event 
    for i in range(5): 
     try: 
      if not exit_event.is_set(): 
       print i 
       sleep(2) 
     except KeyboardInterrupt: 
      print "Interrupt in thread" 
      exit_event.set() 

exit_event = Event() 
bot = Thread(target=count) 
bot.start() 

while not exit_event.is_set(): 
    try: 
     sleep(0.1) 
    except KeyboardInterrupt: 
     print "Interrupt in main loop" 
     exit_event.set() 
bot.join() 
関連する問題