简单的类似crontab的调度器

最近要在python里写一些定时跑的任务, 不太想用crontab来调度,也找不到好的调度开源代码。
所以自己花了一点时间,写了一个简单的实现。
代码如下:


# coding=utf-8
import threading, datetime, logging, time

class Scheduler(object):

def schedule(self,trigger,func):
'''将func任务放入调度列表,根据trigger触发运行
'''
pass

def start(self):
'''开启调度
'''
pass

def stop(self):
'''关闭调度
'''
pass

class SimpleScheduler(Scheduler):
def __init__(self):
self.tasks = []
self.isRun = False

def schedule(self,trigger,func):
'''将func任务放入调度列表,根据trigger触发运行
# 参数说明:
# trigger: 允许 字符串(触发表达式)或者继承了Trigger的类
# 当为字符串时,与linux 的crontab相似
# 如:"15 12 * * *" 五部分,分别为: 分,时,日,月, 周(周为1至7,周一为1, 周日为7)
# 用空格隔开。
#
# 支持的特殊字条:
# * 代表任何,
# , 表示多个情况, 15,16,17 表示三个都可以
# - 表示范围 1-10
# */5 表示每隔5单位时间
#
# func: 可执行的函数
'''
if(type(trigger) == type("")):
self.tasks.append([CronTrigger(trigger),func])
else:
self.tasks.append([trigger,func])

def stop(self):
self.isRun = False

def start(self):
self.isRun = True
timer = threading.Timer(1, self._run)
timer.start()

def _run(self):
while(self.isRun):
now = datetime.datetime.now()
logging.debug("SimpleScheduler: %d:%d" %(now.hour,now.minute))
self._schedule(now)
time.sleep(60)

def _schedule(self,now):
for task in self.tasks:
try:
if task[0].trigger(now):
self._doTask(now,task[1])
except Exception,e:
logging.error(str(e))

def _doTask(self,now,func):
logging.info('do task: time=%s,func=%s' % (now.isoformat(' '),func.func_name))
timer = threading.Timer(1, func)
timer.start()

class Trigger(object):
def trigger(self,time):
return False

class CronTrigger(Trigger):
def __init__(self, exp):
if len(exp.split(' ')) != 5 :
raise Exception('the expression is error : ' + exp)
try:
self._analyzeExp(exp.split(' '))
except Exception,e:
raise Exception('the expression is error : ' + exp)

def trigger(self, time):
nows = [time.isoweekday(),time.month, time.day, time.hour, time.minute]
nows.reverse()
result = [n in t for (n,t) in zip(nows,self.triggers)]
return all(result)

def _analyzeExp(self, exp):
self.triggers = []
self.triggers.append(self._analyzeSingle(exp[0],0,59))
self.triggers.append(self._analyzeSingle(exp[1],0,23))
self.triggers.append(self._analyzeSingle(exp[2],1,31))
self.triggers.append(self._analyzeSingle(exp[3],1,12))
self.triggers.append(self._analyzeSingle(exp[4],1,7))

def _analyzeSingle(self, single, min, max):
if single == '*' :
return range(min,max+1)
elif ',' in single:
return [int(x) for x in single.split(',')]
elif '-' in single:
parts = single.split('-')
maxPart = max
if int(parts[1]) < maxPart:
maxPart = int(parts[1])
minPart = min
if int(parts[0]) > minPart:
minPart = int(parts[0])
return range(minPart, maxPart+1)
elif '*/' in single:
den = int(single[2:])
return [x for x in range(min,max+1) if x%den == 0]
else :
return [int(single),]



原文地址(我的blog): [url="http://www.abublog.info/?p=25"] http://www.abublog.info/?p=25 [/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值