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如何在终端里面显示一张图片
Aug 17 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
softmax及python实现过程解析
Sep 30 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
python ftplib模块使用代码实例
Dec 31 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
详解python的变量缓存机制
Jan 24 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
Python如何导出导入所有依赖包详解
Jun 08 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
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
javascript中的缓动效果实现程序
2012/12/29 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
JS获取当前地理位置的方法
2017/10/25 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
Python学习笔记之os模块使用总结
2014/11/03 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
工商管理专业职业生涯规划
2014/01/01 职场文书
合作经营协议书范本
2014/09/16 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
开场白怎么写
2015/06/01 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
python基础之类属性和实例属性
2021/10/24 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫
德生BCL3000抢先使用感受和评价
2022/04/07 无线电