python定时任务

# -*- coding:utf-8 -*-  
'''
Created on 2016年5月20日

@author: chenyangbo
'''

import time
import heapq
from threading import Timer

TIME_ACCURACY = 1 # 时间精度,时间精度不是越小越好!你的Task每次循环超过了这个值,将影响准确度

class Scheduler(object):
    
    tasks = []
    
    @staticmethod     
    def add(task):
        heapq.heappush(Scheduler.tasks, (task.get_runtime(), task))

    @staticmethod
    def run():
        now = time.time()
        while Scheduler.tasks and now >= Scheduler.tasks[0][0]:
            _,task = heapq.heappop(Scheduler.tasks)
            task.call()
            
            if task.is_cycle():
                task.up_runtime()
                Scheduler.add(task)
                
        t = Timer(TIME_ACCURACY,Scheduler.run)
        t.start()

'''
定时任务
func:要定时执行的方法
args:函数的参数(tuple)
执行start()此定时器生效
'''
class Task(object):
    def __init__(self, func, args = ()):
        self._func = func
        self._args = args
        self._runtime = time.time()
        self._interval = 0
        self._cycle = False
        
    def call(self):
        self._func(*self._args)
        
    def up_runtime(self):
        self._runtime += self._interval
        
    def is_cycle(self):
        return self._cycle
    
    def get_runtime(self):
        return self._runtime
    
    def start(self):
        Scheduler.add(self)
        
'''
作用:简单定时任务
runtime:开始时间(时间戳)
'''
class NormalTask(Task):
    
    def __init__(self, runtime, func, args = ()):
        Task.__init__(self, func, args)
        self._runtime = runtime
        
'''
作用:倒计时定时任务
countdown:倒计时,这个时间后开始执行(单位:秒)
'''
class CountdownTask(Task):
    
    def __init__(self, countdown, func, args = ()):
        Task.__init__(self, func, args)
        self._runtime += countdown
        
'''
作用:循环定时任务
interval:循环周期(单位:秒)
'''
class IntervalTask(Task):
    
    def __init__(self, interval, func, args = ()):
        Task.__init__(self, func, args)
        self._interval = interval
        self._cycle = True
        
        
def test(x, y):        
    print time.time()
    print x + y
        
if "__main__" == __name__:
    Scheduler.run()
    now = time.time()
    
    t = IntervalTask(2, test, (1,2))
    t.start()

 

转载于:https://my.oschina.net/chenyangbo3/blog/699444

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值