文档章节

用sched来定时执行任务

Galy_绿
 Galy_绿
发布于 2015/12/30 17:01
字数 1393
阅读 735
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

2014-3-1阅读6180 评论3

先说一下,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

Galy_绿
粉丝 12
博文 133
码字总数 14908
作品 0
海淀
私信 提问
加载中
请先登录后再评论。
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
3.9K
3
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.1K
1
android下载加速器--axeldroid

axel 是一个linux上的轻量级下载加速器,http://axel.alioth.debian.org/ axeldroid 是将axel移植到android上,并且经过优化,实现了axel的大部分功能,可以指定下载连接数,定时刷新下载进度...

yiitz
2012/12/20
1.9K
1
Akka实战:分散、聚合模式

分散与聚合:简单说就是一个任务需要拆分成多个小任务,每个小任务执行完后再把结果聚合在一起返回。 代码 http://git.oschina.net/yangbajing/akka-action 实例背景 本实例来自一个真实的线...

羊八井
2015/11/26
3.7K
13
刚刚更新:在线聊天系统设计(原理+思路+源码+效果图)

这周项目要做一个在线聊天系统,感觉不是特别困难,原理也很简单,分享给大家。 技术 Java(Spring)+Mysql+MemCache Spring做的是事件驱动模型,所有DB,更新缓存操作改成异步的。 MemCache...

linapex
2015/10/18
6.7K
23

没有更多内容

加载失败,请刷新页面

加载更多

spring boot + mybatis 事务遇到的坑

我们在使用spring自带的事务时,会发现明明加了注解却毫无作用。 @Transactional(rollbackFor = Exception.class) // 加上rollbackFor属性就是为了当抛出所有异常时,皆回滚。 对于注解加入...

季末晚枫
39分钟前
5
0
100% 展示 MySQL 语句执行的神器-Optimizer Trace

在上一篇文章《用Explain 命令分析 MySQL 的 SQL 执行》中,我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行计划未被选择,比如说明明...

程序员历小冰
42分钟前
14
0
Android CDD 兼容性文档

文档列举了设备需要满足的要求才能与最新Android兼容 任何测试套件(包括 CTS)都无法真正面面俱到。例如,CTS 包含一项可检查 OpenGL 图形 API 是否存在及其行为是否正确的测试,但任何软件...

无名之果
44分钟前
27
0
CodeQL的java库(一)

codeql的java库 CodeQL有一个用于分析从Java项目中提取分析CodeQL数据库的扩展库。这个库中的类以面向对象的形式显示数据库中的数据,并提供抽象和谓词来帮助您完成常见的分析任务。该库的实...

国产大熊猫
49分钟前
147
0
transfer learning (迁移学习)

- 很多时候当我们需要训练一个新的图像分类任务,我们不会完全从一个随机的模型开始训练,而是利用_预训练_的模型来加速训练的过程。我们经常使用在`ImageNet`上的预训练模型。 - 这是一种t...

JosiahMg
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部