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

 

转载于:https://my.oschina.net/jhao104/blog/1163036

`sched` 模块Python 标准库中的一个模块,用于实现事件调度器。它提供了一个基于时间的调度器,可以在指定的时间执行任务。可以将其用于一些需要在特定时间执行的任务,例如周期性任务、定时任务等。 `sched` 模块中最常用的是 `scheduler` 类,它提供了一些方法来添加、删除和修改任务。其中最重要的方法是 `enter(delay, priority, action, argument)` ,它用于将一个任务添加到调度器中。这个方法有四个参数: - `delay`:任务的延迟时间,以秒为单位。 - `priority`:任务的优先级,可以是一个整数或浮点数。数值越小,优先级越高。 - `action`:任务要执行的函数。 - `argument`:传递给任务函数的参数。 任务将按照它们的优先级被调度,并在指定的时间执行。 除了 `enter()` 方法之外,`scheduler` 类还提供了其他一些方法,例如 `cancel()` 用于取消一个任务,`empty()` 用于判断调度器是否为空等等。 使用 `sched` 模块需要先创建一个 `scheduler` 对象,然后可以向其中添加任务。例如,下面的代码演示了如何使用 `sched` 模块实现一个简单的定时任务: ```python import sched, time # 定义任务函数 def print_time(): print("It's time to wake up!") # 创建调度器对象 s = sched.scheduler(time.time, time.sleep) # 添加任务到调度器中 s.enter(10, 1, print_time, ()) # 开始调度器 s.run() ``` 这个程序将会在 10 秒后执行 `print_time()` 函数,输出 "It's time to wake up!"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值