博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用sched来定时执行任务(摘抄别人的)
阅读量:4931 次
发布时间:2019-06-11

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

先说一下,time.sleep()来让程序休眠叉叉秒,即运行到这个地方,程序将释放CPU,过了预设的叉叉秒后,程序继续运行。 
看一个简单的例子,我最喜欢以最原始简单的例子来阐述一个东西。 
import time 
for i in range(5): 
    print i 
    time.sleep(10) 
这个程序的结果就是,每隔10s钟输出一下i变量的值。(这个例子似乎不用解释就能明白time.sleep()是如何工作的。 
这个方法虽然简单,但是只能用来实现简单的例子。(不过我觉得用这个方法也是行的,如果要求不是太苛刻) 
现在步入主题,来说一个更高级一些的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(),所以代表的是实际运行那个任务的时刻,所以不是一样的。 
接着,就具体说一下schedule.enter这个对象方法的具体api应用说明 
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

转载于:https://www.cnblogs.com/wang1122/p/6709148.html

你可能感兴趣的文章
【转】Android 语言切换过程分析
查看>>
jpa 多对多关系的实现注解形式
查看>>
Android开发——View绘制过程源码解析(一)
查看>>
Quartz和TopShelf Windows服务作业调度
查看>>
让ie9之前的版本支持canvas
查看>>
排序规则
查看>>
percent的用法
查看>>
中文词频统计
查看>>
Hibernate三种状态详解
查看>>
判断一个数是否是2^N次方
查看>>
Java Win自动环境配置脚本
查看>>
springMVC+Java验证码完善注册功能
查看>>
在虚拟机中的Linux系统搭建ftp服务器,使用nginx代理,实现外网访问ftp服务器的文件——centos6.5系统中的nginx安装及配置...
查看>>
css3媒体查询简单实例
查看>>
java-properties配置文件
查看>>
算法学习-哈希表
查看>>
python操作mysql
查看>>
javascript 学习1
查看>>
Angular应用架构设计-3:Ngrx Store
查看>>
<a>标签文件下载文件名乱码问题
查看>>