2017-01-30 4 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() 
Смежные вопросы