过了年就开始面临毕业了,毕业季是幸福的,但也是紧迫的。2月已过就开始着手策划毕业论文了,一直到现在,论文基本完成了,感觉过去的一个半月的时间,对自己过去2年在实验室所学又温习了一遍。书到用时方恨少,在实验室研究论文的那段日子费了不少精力,等到现在写论文再回头去回忆自己所看文献的时候,突然发现当时没有做个详细的论文研究笔记是一个严重的失误。于是,写论文的过程变成了读一遍文献写一小段,到论文完成,我发现我温故知新,在很多以前没有理解的部分上有了新的认识!

好了,上面是对我最近生活的一点概况。2月下旬,有人看到我在博客园的一片随笔,关于SmartAPI的,然后通过QQ联系我,让我帮忙写个小程序,用于实时的去获取API接口所提供的所有城市的天气状况,于是我在那一周,挤出点时间出来,花了约3天的时间写了一个小demo,初步有了一个成果,并且程序比较稳健。

今天我就其中的一个部分和大家一起分享。客户的需求是,每隔2个小时收集一次实况天气预报,所以我需要写一个简单的调配程序来完成这个任务,即需要一个守护进程去计时,在指定的时间间隔自动调用相关的程序完成数据收集的过程。

开发环境: Windows8.1 + Python2.7

好了,废话不多说,先上代码:

import sched, time
from threading import Thread, Timer
import subprocess
import sys s = sched.scheduler(time.time, time.sleep) class Job(Thread):
def __init__(self, loc):
Thread.__init__(self)
self.loc = loc def run(self):
print_time()
print '--------------- begin to get weather info ---------------'
subprocess.call("forecast3d.exe " + self.loc)
print '--------------- end to get weather info ---------------' def each_day_time(hour, min, sec, next_day):
struct = time.localtime()
if next_day == 0:
day = struct.tm_mday + 1
else:
day = struct.tm_mday
return time.mktime((struct.tm_year,struct.tm_mon,day,
hour,min,sec,struct.tm_wday, struct.tm_yday,
struct.tm_isdst)) def print_time():
print "From print_time", time.ctime() def do_somthing(loc):
job = Job(loc)
job.start() def echo_start_msg():
print '**************** auto task begin running ****************' def main(loc, istomorrow=1):
print '-------------- scheduled task will run once every two hours --------------'
s.enterabs(each_day_time(8, 0, 0, istomorrow), 1, echo_start_msg, ())
s.run()
while(True):
Timer(0, do_somthing, (loc,)).start()
time.sleep(3 * 60 * 60) if __name__ == "__main__":
if len(sys.argv) < 2:
print 'Usage: taskSched location <istomorrow>'
sys.exit()
elif len(sys.argv) == 2:
main(sys.argv[1])
else:
main(sys.argv[1], sys.argv[2])

在Python中,标准库中提供了用于定时的执行某个任务的模块,即sched和Timer类。先说sched模块,准确的说,它是一个调度(延时处理机制),每次想要定时执行某任务都必须写入一个调度。
使用步骤如下:

(1)生成调度器:

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

第一个参数是一个可以返回时间戳的函数,第二个参数可以在定时未到达之前阻塞。可以说sched模块设计者是“在下很大的一盘棋”,比如第一个函数可以是自定义的一个函数,不一定是时间戳,第二个也可以是阻塞socket等。

(2)加入调度事件
其实有enter、enterabs等等,我们以enter为例子。

s.enter(x1,x2,x3,x4)

四个参数分别为:间隔事件、优先级(用于同时间到达的两个事件同时执行时定序)、被调用触发的函数,给他的参数(注意:一定要以tuple给如,如果只有一个参数就(xx,))。

(3)运行

s.run()

分析上面的程序,我们可以知道,我们得目的就是检测系统的时间,当系统时间到达早上8点这个临界点,程序触发。这样的目的就是为了方便程序在前一天晚上跑起来,在第二天的早上8点开始获取第一批数据。

那么,Timer模块的作用呢,说白了就是计时器,程序循环计时,每过一定的时间执行一次收集操作。

最近论文写作完成,下一步的工作是将调度程序写成Windows服务,开机自启动,更加方便!

Python之实时调度任务的更多相关文章

  1. Linux进程管理 (7)实时调度

    关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...

  2. Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验

    关键词:rt_sched_class.SCHED_FIFO.SCHED_RR.sched_setscheduler().sched_setaffinity().RR_TIMESLICE. 本文主要关注 ...

  3. 在Android中使用实时调度(real-time)

    Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改.但问题是程序是以普通用户启动和运行的 ...

  4. 【原创】(六)Linux进程调度-实时调度器

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. 机械师实时调度示例(I) - 实时规划

    OptaPlanner创办人Geoffrey De Smet及其团队,在Red Hat 技术峰会上主题会场上,演示了一个通过OptaPlanner实现实时规划与调度的示例.Geoffrey及其团队专门 ...

  6. 10几行代码,用python打造实时截图识别OCR

    你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率. !   今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时的把你截出来的图片中的文字识别出来. 下 ...

  7. 用Python进行实时计算——PyFlink快速入门

    Flink 1.9.0及更高版本支持Python,也就是PyFlink. 在最新版本的Flink 1.10中,PyFlink支持Python用户定义的函数,使您能够在Table API和SQL中注册和 ...

  8. python获取实时股票信息

    Python3获取股票行情数据(中国个股/中国指数/全球指数) #!/usr/local/bin/python3 #coding=utf-8 #source http://www.cnblogs.co ...

  9. Springmvc中配置Quartz使用,实现任务实时调度。

    菜鸡的自我修炼,第一次接触quartz,做个记录.-------jstarseven 最近在项目中,第一次在springmvc中配置实用quartz,深刻的感受到quartz带来的方便,顺手做个记录. ...

随机推荐

  1. 微软分布式机器学习工具包DMTK——初窥门径

    在现在机器学习如日中天的大背景下,微软亚洲研究院的实习岗位中,机器学习组的工作也是维护DMTK,参与算法改进,那么在此之前我们得了解DMTK是个啥. DMTK由一个服务于分布式机器学习的框架和一组分布 ...

  2. UVA 11491 Erasing and Winning 奖品的价值 (贪心)

    题意:给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大. 题解:因为最后数字位数是确定的,而且低位数字对答案的贡献是一定不及高位数字的,所以优先选择选最大且最靠左边的数字,但是有一个限制,选完这 ...

  3. 八数码问题(一) 暴力BFS + STL

    八数码问题是一个经典的人工智能问题.具体问题不累述了. 思路:由于存在多组测试数据,可以考虑“打表法“.所谓打表法,即枚举所有的初始情况,记录其到达终点的路径.而在这个题目中,顺序打表会调用很多次BF ...

  4. 2018.5.14 PHP基础学习

    1.使用PHP输出HTML 使用PHP输出一个表格,并且通过style标签改变字体 <!--思考与练习--> <style type="text/css"> ...

  5. sum特殊用法

    在python中,list可以存储False和True a = [False] python的sum除了可以加数字,还可以计算列表中False,True的个数,默认是计算False个数 >> ...

  6. C#4.0中的dynamic关键字和ExpandoObject对象

    dynamic最大的特点我想莫过于在它的类型在运行时才确定,这也是它与往静态类型关键字的最大区别.如果你在你的代码操作中用到了dynamic关键字去定义一个变量时,那么这个变量在编译的时候编译器不会对 ...

  7. Ubuntux下简单设置vim

    我自己在vim下的设置,基本写简单脚本用的,在~/.vimrc作出如下设置 syntax on "高亮 set nu "行号显示 set smartindent "基于a ...

  8. 怎么删除服务中的mysql服务

    可以进WINDOWS的管理里查看MYSQL的服务,把它停止或以DOS下用命令停止1.如果要卸载MYSQL执行下面命令:DOS下>mysqld -remove mysql2.启动MYSQL: DO ...

  9. w3resource_MySQL练习:Subquery

    w3resource_MySQL练习题:Subquery 1. Write a query to find the name (first_name, last_name) and the salar ...

  10. 水题:51Nod1432-独木舟

    1432 独木舟 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Problem Description n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两 ...