一、Timer定时器的基本用法
1. Timer的作用
Timer是threading模块中的一个类,用于延迟指定时间后执行某个函数,即“定时器”。- 适合需要“延迟执行”或“定时执行一次”的场景。
2. 基本用法示例
from threading import Timer
def fun():
print('hello world')
if __name__ == '__main__':
timer = Timer(2, fun)
timer.start()
- 这段代码会在主程序启动后等待2秒,然后输出
hello world。
二、让定时器循环执行
1. Timer本身只会执行一次
Timer只会在指定时间后执行一次目标函数,不会自动循环。
2. 如何让定时器循环?
- 可以在
fun函数内部再次创建并启动一个新的Timer,实现“伪循环定时器”。
循环定时器示例
from threading import Timer
def fun():
print('hello world')
timer = Timer(1, fun)
timer.start()
if __name__ == '__main__':
timer = Timer(1, fun)
timer.start()
- 这样,
hello world会每隔1秒输出一次,实现了循环定时的效果。 - 注意:每次都要新建Timer对象,否则只会执行一次。
三、递归算法示例
def fun():
print('hello world')
fun()
if __name__ == '__main__':
fun()
1. 递归的含义
- 递归是指函数自己调用自己。
- 这段代码会无限递归,不断输出
hello world,直到栈溢出(RecursionError)。
2. 递归与定时器的区别
- 递归调用是同步、立即的,每次调用会占用一个新的函数调用栈,速度极快,容易导致栈溢出。
- Timer定时器是异步、延迟的,每次调用会在新线程中延迟执行,不会导致栈溢出,但会不断创建新线程,长期运行也可能导致资源耗尽。
四、总结
- Timer用于延迟执行某个函数,适合定时任务。
- 循环定时器可以通过在回调函数内递归创建Timer实现。
- 递归算法是函数自己调用自己,适合有终止条件的场景,否则会导致栈溢出。
- Timer循环和递归调用的区别:Timer是异步、延迟、线程安全的,递归是同步、立即、易栈溢出。