2017-01-30 165 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()