我们经常需要定时的执行某一个任务,在C/C++ 等语言中我们可以使用定时器,但是在Python中,标准库给我们提供了两种方式Timer和Sched。
先说sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度。使用步骤如下:
1. 生成调度器
s = sched.scheduler(time.time,time.sleep)
第一个参数是一个可以返回时间戳的函数,第二个参数是指未达到定时时间时阻塞函数。
2. 加入调度事件
其实有enter、enterabs等等
s.enter(a,b,c,d);
四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,给他的参数
3. 运行调度器
s.run()
然而:sched模块不是循环的,一次调度被执行后就结束了,如果想再执行,需要再次enter。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from threading import Timer 4 import sched 5 6 # 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。 7 schedule=sched.scheduler(time.time,time.sleep) 8 9 # 被周期性调度触发的函数 10 def execute_command(cmd, inc): 11 os.system(cmd) 12 #schedule.enter(inc, 0, execute_command, (cmd, inc)) 13 14 def main(cmd, inc=60): 15 # enter四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数, 16 # 给该触发函数的参数(tuple形式) 17 schedule.enter(0, 0, execute_command, (cmd, inc)) 18 schedule.run() 19 20 main("netstat -anp | grep tcp", 60)
注意:1. 如果以上函数只能执行一次,如果需要多次循环执行,需要再执行函数中再次enter。2. 如果执行函数只需要一个参数,输入时以(param1,)形式,逗号需要。如果不需要参数则,只需要()即可。
再来说Timer。
Timer类,也不是默认循环调用的,如果需要循环调用,方法与Sched类似,多次start。
Timer类的使用方法如下
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 from threading import Timer 4 5 def print_time(): 6 print "Current time is : ", time.time() 7 Timer(5,print_time,()).start() 8 9 def print_sometime(): 10 Timer(5,print_time,()).start() 11 12 print_sometime()
另外,关于timer 和Sched的官方解释为:https://docs.python.org/2/library/sched.html