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多线程2:sched的更多相关文章

  1. python多线程学习记录

    1.多线程的创建 import threading t = t.theading.Thread(target, args--) t.SetDeamon(True)//设置为守护进程 t.start() ...

  2. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  3. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  4. python多线程

    python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...

  5. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  6. python 多线程就这么简单(续)

    之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...

  7. python多线程监控指定目录

    import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...

  8. python多线程ssh爆破

    python多线程ssh爆破 Python 0x01.About 爆弱口令时候写的一个python小脚本,主要功能是实现使用字典多线程爆破ssh,支持ip表导入,字典数据导入. 主要使用到的是pyth ...

  9. 【python,threading】python多线程

    使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...

  10. <转>Python 多线程的单cpu与cpu上的多线程的区别

    你对Python 多线程有所了解的话.那么你对python 多线程在单cpu意义上的多线程与多cpu上的多线程有着本质的区别,如果你对Python 多线程的相关知识想有更多的了解,你就可以浏览我们的文 ...

随机推荐

  1. [置顶] Android下实现自动关机的方法总结

    最近在网上看了一些Android下实现自动关机的方法,有的不行,有的只适用一些机型,有的适用于大部分机型,笔者在此总结一下 法一: Intent newIntent = new Intent(Inte ...

  2. 重操JS旧业第七弹:面向对象与对象创建

    JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...

  3. 2数组的slice和splice方法

    var colors=["blue","red","black","yellow","gray",& ...

  4. android文件下载大小和网络不一致(偏大)

    今天在写一个文件下载的程序,在网上搜索了一个抄,用来下载MP3文件. 但是发现下载的MP3文件比原来的文件要大,而且MP3中会有杂音. 在Log中加入日志后发现: 从  网络流中获取的流长度为3000 ...

  5. 深入理解extern使用方法

    一. extern做变量声明 l  声明externkeyword的全局变量和函数可以使得它们可以跨文件被訪问. 我们一般把全部的全局变量和全局函数的实现都放在一个*.cpp文件中面,然后用一个同名的 ...

  6. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

  7. 【ASP.NET Web API教程】3.2 通过.NET客户端调用Web API(C#)

    原文:[ASP.NET Web API教程]3.2 通过.NET客户端调用Web API(C#) 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的 ...

  8. eval 捕获错误

    eval 捕获错误: [root@dr-mysql01 ~]# cat t1.pl use DBI; my $dbUser='zabbix'; my $user="root"; m ...

  9. 【Demo 0010】Java基础-泛型

    本章学习要点:       1.  了解泛型基本概念:       2.  掌握泛型的用法:       3.  掌握自定义泛型类: 一.泛型基本概念   二.泛型的用法   三.自定义泛型类   演 ...

  10. linux系统日志及其rsyslog服务

    日志是系统用来记录系统运行时候的一些相关消息的纯文本文件 /var/log下保存着大量的纯文本日志文件 日志的目的是为了保持相关程序的运行状态,错误消息,为了对系统运行进行错误分析使用 1.内核消息 ...