博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python事件调度库sched
阅读量:5054 次
发布时间:2019-06-12

本文共 2306 字,大约阅读时间需要 7 分钟。

事件调度

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(a='default'):    print("From print_time", time.time(), a)def print_some_times():    print(time.time())    # 加入调度事件    s.enter(10, 1, print_time) #default    # 四个参数分别是:    # 间隔时间(具体值决定与delayfunc, 这里为秒);    # 优先级(两个事件在同一时间到达的情况);    # 触发的函数;    # 函数参数    s.enter(5, 2, print_time, argument=('positional',))#positional    s.enter(5, 1, print_time, kwargs={
'a': 'keyword'})#keyword # 运行调度 s.run() print(time.time())print_some_times()
#运行结果:先打印keyword,因为时间5秒,级别1高,然后是5秒级别2的positional,最后才是10秒的default1556808770.1539588From print_time 1556808775.1548176 keywordFrom print_time 1556808775.1548176 positionalFrom print_time 1556808780.15493 default1556808780.15493

在多线程场景中,会有线程安全问题,run()函数会阻塞主线程。官方建议使用threading.Timer类代替

import timefrom threading import Timerdef print_time(t):    print("From print_time", time.time(),t)def print_some_times():    print(time.time())    Timer(5, print_time,args=("5s",)).start()    Timer(10, print_time,args=("10s",)).start()    time.sleep(11)  # 阻塞主线程,等待调度程序执行完毕,再执行后面内容    print(time.time())print_some_times()
#执行结果1556810008.0475848From print_time 1556810013.0481865 5sFrom print_time 1556810018.0492058 10s1556810019.048601

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

 

转载于:https://www.cnblogs.com/angelyan/p/10803857.html

你可能感兴趣的文章
luogu4849 寻找宝藏 (cdq分治+dp)
查看>>
Spring Cloud微服务笔记(五)Feign
查看>>
C语言键盘按键列表
查看>>
Codeforces Round #374 (Div. 2)
查看>>
oracle数据类型
查看>>
socket
查看>>
Vue中使用key的作用
查看>>
二叉索引树 树状数组
查看>>
日志框架--(一)基础篇
查看>>
Java设计模式之原型模式
查看>>
哲理故事与管理之道(20)-用危机激励下属
查看>>
关于源程序到可运行程序的过程
查看>>
转载:mysql数据库密码忘记找回方法
查看>>
scratch少儿编程第一季——06、人在江湖混,没有背景怎么行。
查看>>
面向对象1
查看>>
在ns2.35中添加myevalvid框架
查看>>
【贪心+DFS】D. Field expansion
查看>>
为什么要使用href=”javascript:void(0);”
查看>>
C# Async与Await的使用
查看>>
Mysql性能调优
查看>>