视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python标准库之sched模块介绍
2020-11-27 14:23:39 责编:小采
文档

事件调度

  sched模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。

  class sched.scheduler(timefunc, delayfunc)这个类定义了调度事件的通用接口,它需要外部传入两个参数,timefunc是一个没有参数的返回时间类型数字的函数(常用使用的如time模块里面的time),delayfunc应该是一个需要一个参数来调用、与timefunc的输出兼容、并且作用为延迟多个时间单位的函数(常用的如time模块的sleep)。

  下面是一个列子:

import sched, time

s = sched.scheduler(time.time, time.sleep) # 生成调度器def print_time():print "From print_time", time.time()def print_some_times():print time.time()
s.enter(5, 1, print_time, ()) 
# 加入调度事件# 四个参数分别是:# 间隔事件(具体值决定与delayfunc, 这里为秒);# 优先级(两个事件在同一时间到达的情况);# 触发的函数;# 函数参数;s.enter(10, 1, print_time, ())# 运行s.run()print time.time()if __name__ == '__main__':
print_some_times()

  看到的输出结果,隔5秒中执行第一个事件,隔10秒后执行第二个事件:

1499259731.99From print_time 1499259736.99From print_time 1499259741.991499259741.99

  在多线程场景中,会有线程安全问题,run()函数会阻塞主线程。官方建议使用threading.Timer类代替:

import timefrom threading import Timerdef print_time():print "From print_time", time.time()def print_some_times():print time.time()
Timer(5, print_time, ()).start()
Timer(10, print_time, ()).start()
time.sleep(11) # 阻塞主线程,等待调度程序执行完毕,再执行后面内容print time.time()if __name__ == '__main__':
print_some_times()

Scheduler对象方法

  scheduler对象拥有下面这些方法或属性:

  • scheduler.enterabs(time, priority, action, argument)

  •   加入一个事件,time参数应该是一个与传递给构造函数的timefunc函数的返回值相兼容的数值类型。在同一时间到达的事件将按照priority顺序执行。

      执行事件其实就是执行action(argument)。argument必须是一个包含action参数的序列。

      返回值是一个事件,它可以用于稍后取消事件(请参见cancel())。

  • scheduler.enter(delay, priority, action, argument)

  •   安排一个事件来延迟delay个时间单位。除了时间外,其他参数、含义和返回值与enterabs()的值相同。其实内部enterabs就是用来被enter调用。

  • scheduler.cancel(event)

  •   从队列中删除事件。如果事件不是当前队列中的事件,则该方法将跑出一个ValueError

  • scheduler.empty()

  •   判断队列是否为空。

  • scheduler.run()

  •   运行所有预定的事件。这个函数将等待(使用传递给构造函数的delayfunc()函数),然后执行事件,直到不再有预定的事件。

      任何actiondelayfunc都可以引发异常。在这两种情况下,调度器将保持一个一致的状态并传播异常。如果一个异常是由action引起的,就不会再继续执行run()

  • scheduler.queue

  •   只读属性,返回一个即将到达的事件列表(按到达事件排序),每个事件都是有timepriorityactionargument组成的namedtuple

    下载本文
    显示全文
    专题