如何使用Timer()杀死python进程?

时间:2017-07-18 04:08:51

标签: python python-multithreading

我有一个简单的程序,其函数计划使用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并立即终止所有线程?

1 个答案:

答案 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
%