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号任务执行。

原文地址:https://www.cnblogs.com/lucky-heng/p/10921007.html