Python schedule任务调度及其用法

如果需要执行更复杂的任务调度,可以使用 Python 提供的 sched 模块。提供了该模块 sched.scheduler 类,代表任务调度器。
sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep) 构造器支持两个参数:
timefunc:该参数指定了生成时间戳的时间函数,默认使用 time.monotonic 生成时间戳。
delayfunc:该参数指定了阻塞程序的函数,默认使用 time.sleep 阻止程序的函数。
sched.scheduler 调度器支持以下常用属性和方法:
scheduler.enterabs(time, priority, action, argument=(), kwargs={}):指定在 time 时间点执行 action 函数,argument 和 kwargs 都用于向 action 函数传入参数,其中 argument 以位置参数的形式传入参数,kwargs 以关键字参数的形式传入参数。这种方法返回一个参数 event,它可作为 cancel() 该方法的参数用于取消调度。priority 该参数指定了该任务的优先级。当多个任务需要在同一时间点执行时,优先级高(值越小,优先级越高)的任务将优先执行。
scheduler.enter(delay, priority, action, argument=(),kwargs={}):这种方法和上一种方法基本相同,只是 delay 指定多少秒后执行参数 action 任务。
scheduler.cancel(event):取消任务。如果输入。 event 参数不在当前调度队列中 event,程序会导致 ValueError 异常。
scheduler.empty():判断当前调度器的调度队列是否为空。
scheduler.run(blocking=True):操作所有需要调度的任务。如果调用此方法 blocking 参数为 True,该方法将阻塞线程,直到所有被调度的任务完成。
scheduler.queue:只读属性返回调度器的调度队列。
下面的程序示范了使用 sched.scheduler 执行任务调度:
importsched,time
importthreading
#定义线程调度器
s=sched.scheduler()
#定义被调度函数
defprint_time(name='default'):
print("%s的时间:%s"%(name,time.ctime()))
print('主线程:',time.ctime())
#指定10秒后执行print_time函数
s.enter(10,1,print_time)
#print_time函数在指定5秒后执行,优先级为2
s.enter(5,2,print_time,argument=('位置参数',))
#print_time函数在指定5秒后执行,优先级为1
s.enter(5,1,print_time,kwargs={'name':'关键字参数'})
#执行调度任务
s.run()
print('主线程:',time.ctime())在上述程序中,第 12 行代码指定 10s 后执行 print_time() 函数,这个调度没有为函数传入参数;第 14 行代码指定 5s 后调度 print_time() 函数,本次调度使用位置参数的形式为函数传入参数;第 16 行代码指定 5s 后调度 print_time() 本次调度使用关键字参数的形式为函数传入参数。
上述程序运行后,将看到程序在运行中 5s 后执行两次 print_time() 函数,首先执行传入关键字参数的函数(其优先级较高),10s 后执行一次 print_time() 函数。在操作上述程序时,将看到以下输出结果:
主线程:Tuemar516:30:512019 关键字参数时间:TueMar516:30:562019 TueMar516位置参数的时间:30:562019 default时间:tuemar516:31:012019 主线程:Tuemar516:31:012019
