Python threading.Timer详解:单次触发、循环实现与并发控制
本文深入解析Python中threading.Timer模块的使用。涵盖单次触发机制、通过递归实现循环定时器的方法、cancel取消功能,以及多线程并发执行时的注意事项。重点讨论定时器触发时间的精确控制及可重入性问题,帮助开发者避免常见陷阱,实现稳定的定时任务调度。
threading.Timer
需要注意的是,Timer实例默认仅执行一次回调函数,不会自动重复循环。若需实现周期性循环触发,可参考以下代码示例:
import time
import threading
def createTimer():
t = threading.Timer(2, repeat)
t.start()
def repeat():
print('Now:', time.strftime('%H:%M:%S',time.localtime()))
createTimer()
createTimer()
该代码片段演示了一个每2秒打印当前系统时间的定时器功能。其运行输出效果如下所示:
E:\py>python timer.py Now: 16:36:15 Now: 16:36:17 Now: 16:36:19 Now: 16:36:21 Now: 16:36:23 Now: 16:36:25 Now: 16:36:27
此外,Timer提供了cancel方法,允许在定时器回调函数实际触发之前,提前取消该定时任务。
Timer支持多个定时任务并发执行,各任务之间相互独立,互不干扰。
若需更精确地控制定时器函数的触发间隔,建议将下一次定时器的创建与启动代码置于当前回调函数的起始位置,具体实现如下:
import time
import threading
def createTimer():
t = threading.Timer(2, repeat)
t.start()
def repeat():
createTimer()
print('Now-1:', time.strftime('%H:%M:%S',time.localtime()))
time.sleep(3)
print('Now-2:', time.strftime('%H:%M:%S',time.localtime()))
createTimer()
尽管定时器repeat设定的执行耗时至少为3秒,但在2秒后下一个定时器即可被触发,这是允许的行为。上述代码的实际运行效果如下:
E:\py>python timer.py Now-1: 16:46:12 Now-1: 16:46:14 Now-2: 16:46:15 Now-1: 16:46:16 Now-2: 16:46:17 Now-1: 16:46:18 Now-2: 16:46:19 Now-1: 16:46:20 Now-2: 16:46:21 Now-1: 16:46:22 Now-2: 16:46:23
根据打印日志分析,同时存在多个repeat函数的执行序列是可行的。然而,在此类场景下,必须谨慎评估定时器回调函数的可重入性(reentrancy)问题。
以上介绍了threading.Timer的基本用法,请特别注意两种启动定时器循环计时的方式及其核心区别。
总结
本文到此结束,希望能为读者提供有益的帮助。欢迎持续关注本站以获取更多技术内容!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









