Python多线程2:sched

sched模块提供了一个用于事件调度的类。

scheduler类定义

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep) 
scheduler类为事件调度定义了一套通用接口。它需要传入两个函数:1)timefunc是一个没有参数的callable,并且返回一个一个数字(表示“时间”,任意单位)。如果time.monotonic不是可用的,则默认为time.time。2)delayfunc是带有一个参数的callable,与timefunc的输出兼容,用于延迟一段时间。在多线程应用中,为了给其它线程执行的机会,在每个事件执行后,delayfunc也将使用参数0调用。
从3.3版本开始,scheduler是线程安全的。
下面是一个例子:
>>> 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)
        s.enter(5, 2, print_time, argument=('positional',))
        s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
        s.run()
        print(time.time())
   
>>> print_some_times()
930343690.257
From print_time 930343695.274 positional
From print_time 930343695.275 keyword
From print_time 930343700.273 default
930343700.276

Scheduler对象

Scheduler实例有以下方法和属性:
scheduler.enterabs(time, priority, action, argument=(), kwargs={})
调度一个新事件。time参数应该是一个数字类型,与构造器传入的timefunc函数的返回值兼容。指定到同一个时间的事件调度将按他们的优先级顺序依次执行。
执行时间即为执行action(*argument, **kwargs)。argument是一个序列,按照action的参数顺序排列;kwargs是一个map,使用key对应action的参数。
返回值是一个事件,可以被用于事件的取消(看cancel())。
scheduler.enter(delay, priority, action, argument=(), kwargs={})
在延迟delay时间后调度一个事件。除了使用相对时间,其它的参数和返回值和enterabs是相同的。
scheduler.cancel(event)
从队列中移除事件。如果事件不在当前队列中,该方法抛出ValueError。
scheduler.empty()
如果队列是空的,则返回True。
scheduler.run(blocking=True)
运行所有的事件,这个方法将等待(使用传递给构造器的delayfunc()函数)下一个事件的时间到达,然后执行它,直到所有的事件都被执行。
如果blocking为false,则不阻塞等待,立即调度溢出时间的那些时间(如果存在),然后返回在调度器中的下次调度的需要等待的时间,例如:
>>> 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)
        s.enter(5, 2, print_time, argument=('positional',))
        s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
        print("Next : ",s.run(False))
        print(time.time())
第一次调用:
>>> print_some_times()
1435115632.601069
Next :  5.0
1435115632.656073
Next表示下一个事件将在5秒后执行。第二次超过10秒后调用:
>>> print_some_times()
1435115665.549954
From print_time 1435115665.596957 keyword
From print_time 1435115665.607957 positional
From print_time 1435115665.618958 default
Next :  4.966997861862183
1435115665.635959
这时事件已经全部达到执行时间点,所以全部立即执行。
action后者delayfunc能抛出一个异常,这时,调度器将保持一致并传递该异常。如果异常被action抛出,以后该事件将不会再被执行。
如果一个事件执行的结束时间超过了下一个事件的执行时间,调度器将忽略下一个事件。没有事件会被丢弃。
scheduler.queue
将要执行的事件列表,列表只读,事件按照将要执行的顺序排列。每个事件存储为一个元组,包含:time、priority、action、argument和kwargs。

你可能感兴趣的:(python,编程语言)