捕获KeyboardInterrupt

时间:2015-01-16 05:07:18

标签: python multithreading

我写了一个下面显示的测试应用程序来说明我捕获键盘中断的问题。在主执行线程中运行的try catch块甚至没有得到中断。按下并按住终端中的Control-C会在屏幕上显示一堆^C,但程序仍在运行。它甚至没有打印出它收到停止命令。

我在这个问题上阅读了很多SO帖子和非SO帖子,包括:

  • This post,通过引入守护进程解决了与此问题非常相似的问题(我已经完成了)
  • This post,他们放弃了,并且解决了#34;使用忙循环的问题
  • This article,显然我没有遇到过问题
  • And this post,我用它试图手动安装中断处理程序......但是,没有。

我还将a.finish.wait()更改为a.join();同样的问题。我读过的所有文章显然都没有这个问题,或者放弃并用繁忙的循环来解决它。除非绝对必要,否则我非常希望不要创建一个繁忙的循环。

import time
import threading


class A(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.setDaemon(True)
        self.running = True
        self.finish = threading.Event()

    def stop(self):
        print('STOP!')
        self.running = False

    def run(self):
        while self.running:
            print('I am sleeping. Don\'t bother me.')
            time.sleep(1)
        self.finish.set()


a = A()
a.start()
try:
    a.finish.wait()
except KeyboardInterrupt:
    print('STOP A!')
    a.stop()
a.finish.wait()

0 个答案:

没有答案