我有一个简单的程序,其函数计划使用threading.Timer()
每10秒运行一次。但是我无法用 Ctrl + C 轻松杀死它 - 它会一直抵抗,我必须多次^ C才能杀死它。以下是展示此行为的示例代码:
#!/usr/bin/env python
import sys
import time
from threading import Timer
def scheduled_function():
Timer(10, scheduled_function).start()
print("Scheduled function called...\n")
if __name__ == "__main__":
scheduled_function()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
sys.exit(0)
以下是我运行它并按Ctrl + C时会发生的事情:
$ python timer.py
Scheduled function called...
^C^C^C^C^CScheduled function called...
Exception KeyboardInterrupt in <module 'threading' from '/usr/lib/python2.7/threading.pyc'> ignored
Unhandled exception in thread started by
sys.excepthook is missing
lost sys.stderr
请注意我必须多次使用 ^ C 来杀死它。我想它正在等待计时器到期,然后才退出。
是否有一种干净的方式来捕获KeyboardInterrupt并立即终止所有线程?
答案 0 :(得分:3)
第一个Ctrl-C可能会进入异常处理程序。但是,sys.exit(0)
等待所有非守护程序线程退出。 Timer
是线程的子类,但默认情况下它不是守护进程。
解决方案是让它成为一个守护进程,不幸的是它现在看起来并不干净
def scheduled_function():
t = Timer(10, scheduled_function)
t.daemon = True
t.start()
有了这个改变:
Scheduled function called...
^C
%