Python定时器实例代码
本文详细介绍Python中threading模块Timer类的使用方法,通过实例代码演示如何创建单次及循环定时器。重点解析构造函数参数、函数对象传递、间隔单位设置及cancel停止方法,并提供一个可调节精度的完整定时器脚本供参考。
在实际开发场景中,常需利用定时器来触发特定事件。Python提供了基于线程的定时器实现方式,其用法直观简便。具体示例如下:
import threading
def fun_timer():
print('Hello Timer!')
timer = threading.Timer(1, fun_timer)
timer.start()
运行结果如下:
Hello Timer! Process finished with exit code 0
观察发现,程序仅执行一次输出便立即结束,这通常不符合持续触发事件的需求。查看Timer类的官方文档说明可知:
"""Call a function after a specified number of seconds"""
该说明指出定时器会在指定时间后调用一次函数,并未提及自动循环调用。因此,若需实现重复触发,需对代码进行如下调整:
def fun_timer():
print('Hello Timer!')
global timer
timer = threading.Timer(5.5, fun_timer)
timer.start()
timer = threading.Timer(1, fun_timer)
timer.start()
调整后的运行结果:
Hello Timer! Hello Timer! Hello Timer! Hello Timer! ............
此时定时器按预期正常工作。
在使用Python定时器时,需重点关注以下4个关键点:
(1)Timer构造函数主要接收两个参数:第一个为延迟时间,第二个为要执行的函数名。第一个参数定义多久后执行后续函数;第二个参数必须是函数对象,即直接写函数名(如fun_timer),严禁写成函数调用语句(如fun_timer()),否则会导致报错。可通过type函数查看两者类型的区别。
print(type(fun_timer())) print(type(fun_timer))
类型输出结果:
Hello Timer! <class 'NoneType'> <class 'function'>
(2)若需实现循环定时触发,必须在定时器执行的函数内部重新构造Timer实例。因为Timer默认仅执行一次,必须通过递归或循环方式手动调用start()来维持定时任务。
(3)定时器的时间间隔单位为秒,支持浮点数格式,例如5.5或0.02。在执行函数内部和外部设定的时间值可以不一致。如前例所示,第一次执行fun_timer的延迟为1秒,而后续每次执行的延迟均为5.5秒。
(4)可通过调用cancel()方法来停止定时器的运行,具体示例如下:
# -*- coding: utf-8 -*-
import threading
import time
def fun_timer():
print('Hello Timer!')
global timer
timer = threading.Timer(5.5, fun_timer)
timer.start()
timer = threading.Timer(1, fun_timer)
timer.start()
time.sleep(15) # 15秒后停止定时器
timer.cancel()
对应输出结果:
Hello Timer! Hello Timer! Hello Timer! Process finished with exit code 0
以下提供一个由Python编写的定时器脚本,该脚本支持定时精度的调节,供读者参考使用。
# -* coding: utf-8 -*-
import sys
import os
import getopt
import threading
import time
def Usage():
usage_str = '''说明:
\t定时器
\timer.py -h 显示本帮助信息,也可以使用--help选项
\timer.py -d num 指定一个延时时间(以毫秒为单位)
\t 也可以使用--duration=num选项
'''
print(usage_str)
def args_proc(argv):
'''处理命令行参数'''
try:
opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help', 'duration='])
except getopt.GetoptError as err:
print('错误!请为脚本指定正确的命令行参数。\n')
Usage()
sys.exit(255)
if len(opts) < 1:
print('使用提示:缺少必须的参数。')
Usage()
sys.exit(255)
usr_argvs = {}
for op, value in opts:
if op in ('-h', '--help'):
Usage()
sys.exit(1)
elif op in ('-d', '--duration'):
if int(value) <= 0:
print('错误!指定的参数值%s无效。\n' % (value))
Usage()
sys.exit(2)
else:
usr_argvs['-d'] = int(value)
else:
print('unhandled option')
sys.exit(3)
return usr_argvs
def timer_proc(interval_in_millisecond):
loop_interval = 10 # 定时精度,也是循环间隔时间(毫秒),也是输出信息刷新间隔时间,它不能大于指定的最大延时时间,否则可能导致无任何输出
t = interval_in_millisecond / loop_interval
while t >= 0:
min = (t * loop_interval) / 1000 / 60
sec = (t * loop_interval) / 1000 % 60
millisecond = (t * loop_interval) % 1000
print('\rThe remaining time:%02d:%02d:%03d...' % ( min, sec, millisecond ), end = '\t\t')
time.sleep(loop_interval / 1000)
t -= 1
if millisecond != 0:
millisecond = 0
print('\rThe remaining time:%02d:%02d:%03d...' % ( min, sec, millisecond ), end = '\t\t')
print()
# 应用程序入口
if __name__ == '__main__':
usr_argvs = {}
usr_argvs = args_proc(sys.argv)
for argv in usr_argvs:
if argv in ( '-d', '--duration'):
timer_proc(usr_argvs[argv])
else:
continue
总结
以上为Python定时器实例代码的完整介绍,希望能对读者有所帮助。欢迎查阅:Python生成数字图片代码分享、Python列表删除的三种方法代码分享、13个最常用的Python深度学习库介绍等相关内容。如有任何疑问,欢迎随时留言交流。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









