python使用sched模块执行周期性任务和定时任务
执行周期性任务
sched模块是一个通用的事件调度程序,可以对任务进行延迟调度,基于此,可以用它来实现周期性任务。
# coding:utf8 import time import sched # 初始化scheduler类 # 第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。 s = sched.scheduler(time.time, time.sleep) # 被周期性调度的任务 def task(): print("run time: {}".format(int(time.time()))) def perform(inc): s.enter(inc, 0, perform, (inc,)) task() def main(inc=3): s.enter(0, 0, perform, (inc,)) s.run() if __name__ == "__main__": main()
执行结果为:
>>> run time: 1558716699 >>> run time: 1558716702 >>> run time: 1558716705 >>> run time: 1558716708 >>> ......
任务每隔3s执行一次,周期性执行。
s.enter()方法用来加入调度事件,即将任务加入到队列中,它有四个参数,分别为:间隔时间、优先级(为两个被调度在相同时间执行的函数定序,数字越小,优先级越高)、被调用触发的函数、函数的参数(参数放在元组中,当只有一个参数时,写为(parm,))
s.run()用来执行队列中的任务。
执行定时任务
当单纯执行定时任务时,可以是这样:
# coding:utf8 import time import sched s = sched.scheduler(time.time, time.sleep) def print_time(task_id): print("#{} run time: {}".format(task_id, int(time.time()))) def print_some_times(): print(int(time.time())) s.enter(10, 1, print_time, (0,)) s.enter(5, 2, print_time, (1,)) s.enter(5, 1, print_time, (2,)) s.run() print(int(time.time())) if __name__ == "__main__": print_some_times()
执行结果为:
>>> 1558716127 >>> #2 run time: 1558716132 >>> #1 run time: 1558716132 >>> #0 run time: 1558716137 >>> 1558716137
可以看到,执行总耗时为10s,执行开始后5s,1号和2号任务同时到达执行时间,由于2号任务的优先级高先执行,后面1号任务执行,10s后,0号任务执行。