Python之实时调度任务
过了年就开始面临毕业了,毕业季是幸福的,但也是紧迫的。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之实时调度任务的更多相关文章
- Linux进程管理 (7)实时调度
关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...
- Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验
关键词:rt_sched_class.SCHED_FIFO.SCHED_RR.sched_setscheduler().sched_setaffinity().RR_TIMESLICE. 本文主要关注 ...
- 在Android中使用实时调度(real-time)
Linux的线程调度策略中有FIFO和RT的实时调度方法,但是在Android中做了限制,普通用户不能修改线程的调度算法为FIFO和RT,必须ROOT用户才能更改.但问题是程序是以普通用户启动和运行的 ...
- 【原创】(六)Linux进程调度-实时调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- 机械师实时调度示例(I) - 实时规划
OptaPlanner创办人Geoffrey De Smet及其团队,在Red Hat 技术峰会上主题会场上,演示了一个通过OptaPlanner实现实时规划与调度的示例.Geoffrey及其团队专门 ...
- 10几行代码,用python打造实时截图识别OCR
你一定用过那种“OCR神器”,可以把图片中的文字提取出来,极大的提高工作效率. ! 今天,我们就来做一款实时截图识别的小工具.顾名思义,运行程序时,可以实时的把你截出来的图片中的文字识别出来. 下 ...
- 用Python进行实时计算——PyFlink快速入门
Flink 1.9.0及更高版本支持Python,也就是PyFlink. 在最新版本的Flink 1.10中,PyFlink支持Python用户定义的函数,使您能够在Table API和SQL中注册和 ...
- python获取实时股票信息
Python3获取股票行情数据(中国个股/中国指数/全球指数) #!/usr/local/bin/python3 #coding=utf-8 #source http://www.cnblogs.co ...
- Springmvc中配置Quartz使用,实现任务实时调度。
菜鸡的自我修炼,第一次接触quartz,做个记录.-------jstarseven 最近在项目中,第一次在springmvc中配置实用quartz,深刻的感受到quartz带来的方便,顺手做个记录. ...
随机推荐
- [VC]关于ocx打包为cab的使用
把打包的工具makecert.exe等放在c:/windows/system32/里才能在dos下面使用 注:如果本机使用可以codebase="http://localhost/testa ...
- Java基础面试操作题: File IO 文件过滤器FileFilter 练习 把一个文件夹下的.java文件复制到另一个文件夹下的.txt文件
package com.swift; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- VueJS坎坷之路222--vue cli 3.0引入静态文件
前两天准备搭建一个vue小项目,当引入jquery脚本的时候一直找不到引入的文件: 在网上搜了好多vue添加静态文件的方法,发现大多数方法都是创建一个与文件夹src同等级的文件夹static存放引入的 ...
- 创建自定义 Estimator
ref 本文档介绍了自定义 Estimator.具体而言,本文档介绍了如何创建自定义 Estimator 来模拟预创建的 Estimator DNNClassifier 在解决鸢尾花问题时的行为.要详 ...
- Redis错误解决:(error) MISCONF Redis is configured to save RDB snapshots
刚开始学习使用redis数据库,在执行删除命令时,提示了我这么一个错误: 错误提示 (error) MISCONF Redis is configured to save RDB snapshots, ...
- Docker 镜像&仓库 获取及推送镜像
docker查看.删除镜像 docker镜像存储位置: /var/lib/docker 查看docker信息也可以查看保存位置 docker info 1.列出镜像 docker images -aa ...
- OpenCV中图像的BGR格式及Img对象的属性说明
1. 图像的BGR格式说明 OpenCV中图像读入的数据格式是numpy的ndarray数据格式.是BGR格式,取值范围是[0,255]. 如下图所示,分为三个维度: 第一维度:Height 高度,对 ...
- Linux扩增卷组、逻辑卷以及缩减逻辑卷
今天我们将了解怎样来扩展卷组,扩展和缩减逻辑卷.在这里,我们可以缩减或者扩展逻辑卷管理(LVM)中的分区,LVM也可称之为弹性卷文件系统. 前置需求使用LVM创建弹性磁盘存储——第一部分 什么时候我们 ...
- Jenkins自动化搭建测试环境(二)
Fork项目 找到项目 单击Fork 这时,会发送一个邮件到你的git邮箱中,点击链接即可完成fork 这样,这个工程就已经fork到自己的git上了 然后就可以下载这个工程到本机了 这里我们需要使用 ...
- [转] babel-present-env 与 babel-polyfill 学习总结
babelrc 配置文件 { "presets": [ [ "env", { "modules": false, "useBuil ...