Python标准库sched模块使用指南


Posted in Python onJuly 06, 2017

事件调度

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 。

Python 相关文章推荐
Python 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
Java与Python两大幸存者谁更胜一筹呢
Apr 12 Python
tensorflow学习笔记之简单的神经网络训练和测试
Apr 15 Python
详解Python学习之安装pandas
Apr 16 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Django实现文件上传和下载功能
Oct 06 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
Feb 27 Python
Python openpyxl 插入折线图实例
Apr 17 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 #Python
基于Python的关键字监控及告警
Jul 06 #Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 #Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 #Python
利用python实现简单的循环购物车功能示例代码
Jul 05 #Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 #Python
Python对象类型及其运算方法(详解)
Jul 05 #Python
You might like
什么是调频(FM)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
PHP完整的日历类(CLASS)
2006/11/27 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
python转换摩斯密码示例
2014/02/16 Python
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
python七夕浪漫表白源码
2019/04/05 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
python圣诞树编写实例详解
2020/02/13 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
Europcar比利时:租车
2019/08/26 全球购物
播音主持专业个人自我评价
2014/01/09 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
mysql事务隔离级别详情
2021/10/24 MySQL
python中redis包操作数据库的教程
2022/04/19 Python
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS