用sched来定时执行任务

2014-3-1阅读6180 评论3 html

先说一下,time.sleep()来让程序休眠叉叉秒,即运行到这个地方,程序将释放CPU,过了预设的叉叉秒后,程序继续运行。 python

看一个简单的例子,我最喜欢以最原始简单的例子来阐述一个东西。 编程

import time

for i in range(5):
    print i
    time.sleep(10)

这个程序的结果就是,每隔10s钟输出一下i变量的值。(这个例子彷佛不用解释就能明白time.sleep()是如何工做的。

这个方法虽然简单,可是只能用来实现简单的例子。(不过我以为用这个方法也是行的,若是要求不是太苛刻) api



如今步入主题,来讲一个更高级一些的sched方法来定时执行任务。 安全

import time
import sched

schedule = sched.scheduler ( time.time, time.sleep )

def func(string1,float1):
    print "now is",time.time()," | output=",string1,float1

print time.time()
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(2,0,func,("test1",time.time()))
schedule.enter(3,0,func,("test1",time.time()))
schedule.enter(4,0,func,("test1",time.time()))
schedule.run()
print time.time()
这个例子的输出结果是:
1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645452.07  | output= test1 1393645450.07
now is 1393645453.07  | output= test1 1393645450.07
now is 1393645454.07  | output= test1 1393645450.07
1393645454.07

首先说分析一下,schedule是一个对象,每次等于它后面的那个就好了, 多线程

schedule这个家伙就像一个预存你要定时执行的任务们儿 的盒子。 schedule.enter就是把你要定时多少秒后执行的任务放到这个盒子里去。而schedule.run就是这时候去run你盒子的全部任务,任务就在这个时刻后,依次相对于这个时刻点的多少秒后运行。若是没有run,那但是不会让盒子的任务被执行。 分布式


为何每一行输出的最后一个时间数据都是同样的(除了最后一行)?由于他们传入函数的数据是当时运行schedule.enter的那个时间点,并不是是你定时运行的那个时刻。 函数

而输出中“now is  什么什么”的那个时刻,是运行的func函数中的time.time(),因此表明的是实际运行那个任务的时刻,因此不是同样的。 spa



接着,就具体说一下schedule.enter这个对象方法的具体api应用说明 .net

schedule是一个对象,名称是其余的都行,只要是这一号任务便可,别搞个字符串来.enter就好了。(这篇教程写得仍是比较面向初学者,废话挺多)

schedule.enter(delay, priority, action, arguments)

第一个参数是一个整数或者float,表明多少秒后执行这个action任务。

第二个参数priority是优先级,0表明优先级最高,1次之,2次次之…当两个任务是预约在同一个时刻执行时,根据优先级决定谁先执行。

第三个参数就是你要执行的任务,能够简单的理解成你要执行的函数的函数名。

第四个参数是你要传入的这个定时执行的action为函数名的函数的参数,最好是用"()"括号来包起来,包起来确定是不会出错的。其次,当你只传入一个参数时,用括号包起来后,必定要记住再打上一个逗号。即:schedule.enter(delay, priority, action, (argument1,))             虽然看起来有有点怪,但必定要这样,不然,会出现错误,好比你不打逗号,你传入一个字符串,它会觉得你传入的是一个个字符,且每一个字符的地位等于一个参数。总之切记,打上逗号,就安全了。不然会出问题的。 另外若是没有参数要传入,就直接传入空括号便可,即:schedule.enter(delay, priority, action, () )




最后,来讲个更高级的东西,

在多线程的环境里,上面的sched方法搞出来这个schedule搞搞搞搞,会由于线程安全的问题从而存在限制,一个东西执行了,若是没结束,另一个东西就要等。阻塞了。

而咱们能够用多线程的方式,避免在一条通道上堵车。

即神器——threading.Timer类。例子以下:

import time
from threading import Timer

def print_time( enter_time ):
    print "now is", time.time() , "enter_the_box_time is", enter_time


print time.time()
Timer(5,  print_time, ( time.time(), )).start()
Timer(10, print_time, ( time.time(), )).start()
print time.time()
输出结果以下:
>>> 1393660025.58
>>> 1393660025.58
>>> now is 1393660030.58 enter_the_box_time is 1393660025.58
>>> now is 1393660035.58 enter_the_box_time is 1393660025.58

Timer就自动执行了,不须要再放到盒子里,而后一会儿.run一下,另外,也不须要分优先级,能够同时处理喔,为了显示多线程同时处理的效果,能够把上面的第二个Timer的第一个参数也改为5,而后实验一下输出结果,以下:
>>> 1393660052.12
>>> 1393660052.12
>>> now isnow is 1393660057.12 enter_the_box_time is 1393660052.12
 1393660057.12 enter_the_box_time is 1393660052.12

由于是同时输出,而屏幕只有一个,因此发生了混在一块儿的这种有些混乱的局面,这充分说明了是同时输出。威力好大吧。有个高中同位在美国读博士,就是写底层的科学家,像分布式运算、以及利用显卡的计算能力去运算,这种东西我不擅长,这哥们内功深厚啊,惋惜哥老矣,哥混的是景观规划设计界,多年没有提刀编程了,感受枯藤老树昏鸦了。想起这高中同位,历历在目,写底层,内功深厚啊。老子的专业只有景观三元论,原本挺进步的,后来就成了幽默。

最后说个网址,是sched的官方手册,http://docs.python.org/2/library/sched.html

相关文章
相关标签/搜索