Python线程Timer重复调用失效问题:强制终止是否为诱因?
Timer线程重复调用失效的场景分析
先看你的代码逻辑:每次thread_run执行完run()后,会创建一个2秒后触发的Timer线程来调用自身,看似能无限循环,但出现打印before和after却没打印start就退出的情况,主要是以下场景导致:
1. 主线程提前终止
threading.Timer默认创建的是守护线程,Python的规则是:当所有非守护线程结束时,整个程序会立即终止,所有守护线程会被强制杀死。
如果你的主程序没有其他持续运行的非守护线程,第一次thread_run执行完毕返回后,主线程可能已经走到了程序末尾(比如主函数执行完了所有代码),此时虽然Timer已经启动,但它是守护线程,主线程一退出,Timer还没到2秒触发时间就被干掉了,自然不会执行下一次thread_run,也就不会打印start。
2. 未捕获的异常导致Timer线程执行失败
如果下一次Timer触发时,self.thread_run的执行一开始就抛出了未捕获的异常(比如self对象已经被销毁),那start还没打印就会终止,但这种情况通常会有异常栈输出,你可以检查是否有未处理的错误。
关于Ctrl+C的影响
Ctrl+C会触发KeyboardInterrupt异常,如果你的程序没有捕获这个异常,主线程会直接退出,此时如果Timer线程还没到触发时间,或者刚启动还没执行到print('start'),就会被主线程带走,导致你看到程序退出但没打印start。但这是强制终止时的正常现象,不是正常运行时自动失效的原因。
内容的提问来源于stack exchange,提问作者corone
相关产品推荐
相关产品推荐

