文档章节

用sched来定时执行任务

Galy_绿
 Galy_绿
发布于 2015/12/30 17:01
字数 1393
阅读 233
收藏 0
点赞 0
评论 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

本文转载自:http://m.blog.csdn.net/blog/u013802726/20216569

共有 人打赏支持
Galy_绿
粉丝 12
博文 132
码字总数 14908
作品 0
海淀
Python定时任务(上)

图片来自 unsplash 在项目中,我们可能遇到有定时任务的需求。其一:定时执行任务。例如每天早上 8 点定时推送早报。其二:每隔一个时间段就执行任务。比如:每隔一个小时提醒自己起来走动走...

猴哥Yuri ⋅ 2017/12/06 ⋅ 0

Timer 定时器相关类

Timer相关类 定时执行相关类,包括java.util.Timer,以及TimerTask、还有内部类TaskQueue、TimerThread等 java.util.TimerTask Timer执行的调度单元。 常用的属性 Task下一次执行时间 执行间...

刀狂剑痴 ⋅ 2016/04/11 ⋅ 0

quartz 2.2.1 为什么不会执行myjob中的函数

public class QuartzTest { public void run() throws Exception { // 调度工厂 SchedulerFactory sf = new StdSchedulerFactory(); // 从工厂中,获取一个任务调度实体 Scheduler sched = ......

linksk ⋅ 2013/12/12 ⋅ 1

任务调度开源框架Quartz动态添加、修改和删除定时任务

Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特...

奋斗的小菜一碟 ⋅ 2015/12/07 ⋅ 0

quartz动态生成任务

Bean类 @Entity @Table(name = "MYTASK") public class MyTask implements Serializable{ / / private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = Generatio......

奋斗的小菜一碟 ⋅ 2015/12/29 ⋅ 0

Quartz 动态生成任务

Bean类 @Entity @Table(name = "MYTASK") public class MyTask implements Serializable{ / / private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = Generatio......

奋斗的小菜一碟 ⋅ 2015/12/21 ⋅ 0

java 定时任务之Timer

java 定时任务之Timer Timer是什么? Timer位于java.util包中。官方API的描述是用来控制任务执行的,每个任务可以执行一次,也可以执行多次。在实际应用中,我们可以用它来控制某个任务在特定...

一条大河波浪宽 ⋅ 2015/10/02 ⋅ 2

quartz2.2 官方例子3

quartz 官方例子3 所需jar: quartz-2.2.0.jar quartz-jobs-2.2.0.jar slf4j-api-1.7.5.jar slf4j-log4j12-1.7.5.jar log4j-1.2.16.jar quartz.properties 配置: org.quartz.scheduler.inst......

fanson59 ⋅ 2013/08/14 ⋅ 0

Mac 使用 launchctl 定时运行程序

在linux下可以用crontab来定时执行任务,在MAC下可以用launchctl来定时执行任务。 我们使用launchctl来做一个定时执行任务的例子。 首先做一个可执行的脚本,脚本名字叫做:AutoMakeLog.sh,...

Jackin ⋅ 2014/05/10 ⋅ 3

Python脚本用于定时关闭网易云音乐PC客户端

本文主要讲述如何使用Python在指定的秒数后关闭Windows上运行的程序(此程序以网易云音乐为例)。本文的背景是昨晚发现网易云音乐的PC客户端没有定时关闭的功能,可以使用Python编写一个简单...

urey_pp ⋅ 2017/04/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 23分钟前 ⋅ 0

设计模式 之 享元模式

设计模式 之 享元模式 定义 使用共享技术来有效地支持大量细粒度对象的复用 关键点:防止类多次创建,造成内存溢出; 使用享元模式来将内部状态与外部状态进行分离,在循环创建对象的环境下,...

GMarshal ⋅ 38分钟前 ⋅ 0

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 今天 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 8

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部