Python标准库笔记(5) — sched模块
目录[-]
事件调度
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()
函数),然后执行事件,直到不再有预定的事件。
任何action
或delayfunc
都可以引发异常。在这两种情况下,调度器将保持一个一致的状态并传播异常。如果一个异常是由action
引起的,就不会再继续执行run()
。
- scheduler.queue
只读属性,返回一个即将到达的事件列表(按到达事件排序),每个事件都是有time
、priority
、action
、argument
组成的namedtuple
。
- Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)
- 温故而知新:Asp.Net中如何正确使用Session
- Android新手之旅(13) listview中数据重复的问题
- 温故而知新:HttpApplication,HttpModule,HttpContext及Asp.Net页生命周期
- proxy_pass反向代理配置中url后面加不加/的说明
- Android新手之旅(10) 嵌套布局
- C#代码也VB
- Docker容器学习梳理--SSH方式登陆容器
- Docker网络解决方案-Flannel部署记录
- Nginx的location配置规则梳理
- 统计代码行数的方法梳理
- 如何在不影响asp.net默认安全性的前提下使用ckeditor/fckeditor?
- Linux下防御DDOS攻击的操作梳理
- Android新手之旅(8) ListView的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python数据科学:方差分析
- 推荐3个开源的快速开发平台,前后端都有,项目经验又有着落了!
- Python数据科学:卡方检验
- Java 中使用 Redis
- Python数据科学:线性回归
- 人生苦短,我用k8s--------------单节点二进制部署
- 人生苦短,我用k8s--------------k8s集群二进制部署
- 从零开始学习 JD Chain(四)-使用穿透式检索-Release
- 用Python清除文件夹中的重复视频
- Python数据科学:线性回归诊断
- 用Python自动化生成倒计时图片
- (译)SDL编程入门(12)色彩调制
- (译)SDL编程入门(11)裁剪渲染和精灵表
- Python数据科学:正则化方法
- libVLC教程