Python 如何使用threading.event函数终止线程?

Python 如何使用threading.event函数终止线程?,python,multithreading,queue,Python,Multithreading,Queue,我一直在考虑在用户中断后停止线程,但出于某种原因,它对我不起作用。有人能帮忙吗。问题是程序只是忽略键盘中断错误,键盘中断后程序不会关闭 #!/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 E

我一直在考虑在用户中断后停止线程,但出于某种原因,它对我不起作用。有人能帮忙吗。问题是程序只是忽略键盘中断错误,键盘中断后程序不会关闭

#!/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
#/usr/bin/env python
#
#
从时间上导入睡眠
从队列导入队列
从线程导入线程、事件、锁
def Count():
全球出口
对于范围(5)中的i:
尝试:
如果不退出。是否设置为()
与l:
印刷品一;睡眠(2)
除键盘中断外:
Exit.set()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
l=锁()
q=队列()
退出=事件()
对于范围(2)中的i:
Bot=线程(目标=(计数)).start()
q、 put(Bot)
#q、 加入
#输出
0
1.
^C2
3.
4.
0
忽略中的异常键盘中断

不完全清楚您想要实现什么。所以我重组了你的代码

  • 我已经删除了您正在放入东西的队列,但没有从中取出任何东西
  • 我移除了锁,它没有被一个以上的线程调用,更糟糕的是在睡眠期间持有锁
  • 我在主循环的末尾加入线程,而不是加入一个永远不会为空的队列
  • 最后,我检查所有线程中的键盘中断


  • 您能否分享错误和预期行为?
    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()