【Python】300行代码实现crontab定时器功能 【上】

简介: 熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:

【Python】300行代码实现crontab定时器功能


熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:


微信截图_20220424094448.png


  具体Timer模块的代码也贴在下面,提供了与crontab定时任务类似的功能实现,第一次贴全部代码,格式弄的有点乱。


# -*- coding:utf-8 -*-
import re
import uuid
import time
import datetime
import threading
class TimerInfo:
  """定时器配置"""
  def __init__(self, timer_info, call_able, call_args):
     """创建定时器配置"""
     self.minutes = (-1, -1)   
     self.hours = (-1, -1)
     self.day_of_month = (-1, -1)
     self.month = (-1, -1)
     self.day_of_week = (-1, -1)
     self.enable = False     # 默认不可用
     self.last_check = None
     self._parse(timer_info)
     self.call_able = call_able
     self.call_args = call_args
     self.call_condition = None
     self.cur_condition = None
  def _parse(self, timer_info):
     """解析数据"""
     try:
        m, h, dfm, month, dfw = re.findall(r"\S+", timer_info)
        self.minutes = self._parse_part(m)
        self.hours = self._parse_part(h)
        self.day_of_month = self._parse_part(dfm)
        self.month = self._parse_part(month)
        self.day_of_week = self._parse_part(dfw)
        self.enable = True
        self.last_check = datetime.datetime.now()
     except Exception as e:
        print("invalid timer config : %s, error:%s" % (timer_info, e))
        return
  def _check_condition(self, condition, cur_value, delay_param, delay_transform=1):
     """检查条件"""
     if condition[0] < 0:
        return True
     if condition[0] == 0:
        if not self.check_target_value(condition[1], cur_value):
            return False
     # 每隔多久执行一次 */N 每隔N分钟执行一次
     elif condition[0] == 1:
        # 存在区间
        if isinstance(condition[1], list):
         if not self.check_range_value(cur_value, condition[1][0], condition[1][1]):
              return False
           if not self.check_delay_value(delay_param, condition[1][2] * delay_transform):
              return False
        # 间隔
        elif not self.check_delay_value(delay_param, condition[1] * delay_transform):
            return False
     # 多个M,N,X 在M,N,X时间执行
     elif condition[0] == 2:
       if not self.check_multi_value(cur_value, condition[1]):
           return False
     # 区间A-B
     elif condition[0] == 3:
       if not self.check_range_value(cur_value, condition[1][0], condition[1][1]):
           return False
     # 异常
     else:
        return False
     # 添加满足的条件
     self.cur_condition += "%s" % cur_value
     return True
  def on_timer(self, date_time):
     """执行检查"""
     if not self.enable:
        return False
     # 计算日期差值
     sub_time = date_time - self.last_check
     # 创建一个添加key,执行检查可能会成功,但运行过就不运行
     self.cur_condition = ""
     # 分
     if not self._check_condition(self.minutes, date_time.minute, sub_time.seconds, 60):
        self.call_condition = None
        return False
     # 时
     if not self._check_condition(self.hours, date_time.hour, sub_time.seconds, 3600):
        self.call_condition = None
        return False
     # 日
     if not self._check_condition(self.day_of_month, date_time.day, sub_time.days, 1):
         self.call_condition = None
         return False
     # 月
     if not self._check_condition(self.month, date_time.month, self._sub_months(self.last_check, date_time), 1):
         self.call_condition = None
         return False
     # 周
     if not self._check_condition(self.day_of_week, date_time.weekday(), sub_time.days/ 7, 1):
         self.call_condition = None
         return False
     # 满足条件则更新检查时间
     self.last_check = date_time
相关文章
|
7月前
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
347 26
|
7月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
532 1
|
7月前
|
机器学习/深度学习 算法 调度
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
基于多动作深度强化学习的柔性车间调度研究(Python代码实现)
368 1
|
6月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
354 100
|
6月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
533 95
|
7月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
350 101
|
7月前
|
Python
Python的简洁之道:5个让代码更优雅的技巧
Python的简洁之道:5个让代码更优雅的技巧
358 104
|
7月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
625 99
|
6月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
337 88
|
7月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
368 102