我写了一个下面显示的测试应用程序来说明我捕获键盘中断的问题。在主执行线程中运行的try catch块甚至没有得到中断。按下并按住终端中的Control-C会在屏幕上显示一堆^C
,但程序仍在运行。它甚至没有打印出它收到停止命令。
我在这个问题上阅读了很多SO帖子和非SO帖子,包括:
我还将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()