我们经常需要定时的执行某一个任务,在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 importTimer4 importsched5
6 #第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。
7 schedule=sched.scheduler(time.time,time.sleep)8
9 #被周期性调度触发的函数
10 defexecute_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 importTimer4
5 defprint_time():6 print "Current time is :", time.time()7 Timer(5,print_time,()).start()8
9 defprint_sometime():10 Timer(5,print_time,()).start()11
12 print_sometime()
View Code
另外,关于timer 和Sched的官方解释为:https://docs.python.org/2/library/sched.html