事件调度

  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.99
From print_time 1499259736.99
From print_time 1499259741.99
1499259741.99

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

import time
from threading import Timer def 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

最新文章

  1. 《Java多线程核心技术》读书摘要
  2. [Python模式]策略模式
  3. JVM -Xss调整Stack Space的大小 【转】
  4. node http.get请求
  5. HDU 多校联合练习赛2 Warm up 2 二分图匹配
  6. Android studio 查看sha1
  7. WPF中的触发器简单总结
  8. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶
  9. avg 的使用
  10. Spring中属性注入的几种方式以及复杂属性的注入
  11. ubuntu创建新用户
  12. c++中sort()函数的用法
  13. emacs 利用 auto-complete 自动补齐
  14. 有关自动化构建gulp的搭建
  15. [SCOI2012] 喵星球上的点名
  16. js history
  17. ubantu18.04下Hadoop安装与伪分布式配置
  18. 如何用BarTender将日期变量和序列号变量放一起打印成条码?
  19. BabelMap 10.0.0.5 汉化版已经发布
  20. Remove-Invalid-Parentheses-题解

热门文章

  1. 一张图看懂css的position里的relative和absolute的区别
  2. Solr实现SQL的查询与统计--转载
  3. BZOJ 2157 旅行(树链剖分码农题)
  4. BZOJ 1483 梦幻布丁(链表+启发式合并)
  5. 【bzoj2906】颜色 分块
  6. css基于文件格式使用不同的样式
  7. [BZOJ1195]最短母串
  8. castle activerecord 学习过程出现的问题
  9. 9个基于Java的搜索引擎
  10. struts2 文件下载的处理