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()函数),然后执行事件,直到不再有预定的事件。

任何actiondelayfunc都可以引发异常。在这两种情况下,调度器将保持一个一致的状态并传播异常。如果一个异常是由action引起的,就不会再继续执行run()

  • scheduler.queue

只读属性,返回一个即将到达的事件列表(按到达事件排序),每个事件都是有timepriorityactionargument组成的namedtuple

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java开发者杂谈

Python(2):创建函数模块

说明: 在使用python的时候我们除了使用内置的函数之外,可能还需要使用一些别人写的函数。或者我们写的代码也希望可以给其他人使用。要实现这样的功能,我们就需要...

365120
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

22640
来自专栏码农阿宇

visual studio编写C#代码时“未能从程序集.....中加载类型”和“找不到方法”的一种可能的解决办法

编译前报错:$exception    {"未能从程序集“XSW.MySQLDAL, Version=1.0.0.0, Culture=neutral, Pub...

36560
来自专栏数据结构与算法

2991:2011

2991:2011 查看 提交 统计 提问 总时间限制:1000ms内存限制:65536kB描述已知长度最大为200位的正整数n,请求出2011^n的后四位。输...

35370
来自专栏数值分析与有限元编程

Fortran知识 | 代码错误(insufficient virtual memory)

如图所示,提示为:insufficient virtual memory ? 程序试图访问一个受保护或者不存在的地址。多数为可分配数组、指针等动态内存引发的错误...

42270
来自专栏AILearning

多线程的基础学习

进程:是一个正在执行中的程序, 每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。 线程:是进程中的一个独立的控制单元, 线程在控制中进...

19770
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

13430
来自专栏黑泽君的专栏

什么是Hibernate延时加载?

8820
来自专栏xingoo, 一个梦想做发明家的程序员

python项目实现配置统一管理的方法

一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数。最近看了不少的python项目,总结了两种很有意思的配置管理方法。

34210
来自专栏程序员的碎碎念

php常用函数(一)

parse_url:函数的作用是解析一个URL并返回一个包含其URL组件的关联数组,错误时返回false。例: ? 页面显示效果如下: ? ran...

36640

扫码关注云+社区

领取腾讯云代金券