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解析xml文件实例分享
Dec 04 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
May 25 Python
python脚本实现验证码识别
Jun 07 Python
Linux下python与C++使用dlib实现人脸检测
Jun 29 Python
Python高斯消除矩阵
Jan 02 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
解决Django生产环境无法加载静态文件问题的解决
Apr 23 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
Pytorch的mean和std调查实例
Jan 02 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 15 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中上传大体积文件时需要的设置
2006/10/09 PHP
实用函数4
2007/11/08 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
js和php如何获取当前url的内容
2013/09/22 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
关于 angularJS的一些用法
2017/11/29 Javascript
element-ui表格列金额显示两位小数的方法
2018/08/24 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
python 循环while和for in简单实例
2016/08/16 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python模拟实现斗地主发牌
2020/01/07 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
python switch 实现多分支选择功能
2020/12/21 Python
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
制药工程专业职业生涯规划范文
2014/03/10 职场文书
试用期自我鉴定范文
2014/03/20 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP