【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
相关文章
|
21小时前
|
监控 Python
Python中的装饰器:提升代码灵活性和可维护性
在Python编程中,装饰器是一种强大的工具,可以提高代码的灵活性和可维护性。本文将深入探讨装饰器的概念、用法和实际应用,帮助读者更好地理解并运用装饰器来优化自己的Python代码。
|
1天前
|
算法 Java 编译器
优化Python代码性能的实用技巧
提高Python代码性能是每个开发者的关注焦点之一。本文将介绍一些实用的技巧和方法,帮助开发者优化他们的Python代码,提升程序的执行效率和性能。
|
3天前
|
Python
Python中的装饰器:提升代码可读性与复用性
Python中的装饰器是一种强大的工具,能够提升代码的可读性和复用性。本文将深入探讨装饰器的原理、用法以及在实际项目中的应用,帮助读者更好地理解和利用这一特性,提升代码质量和开发效率。
|
4天前
|
监控 Python
Python中的装饰器:提升代码可读性与可维护性
Python中的装饰器是一种强大的工具,可以在不修改函数源代码的情况下,增加新的功能。本文将介绍装饰器的基本概念,以及如何使用装饰器来提升代码的可读性和可维护性。通过实例演示,读者将了解装饰器在各种场景下的灵活运用,从而更好地理解并应用于实际开发中。
|
4天前
|
缓存 Python
Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以通过在函数或方法周围包装额外的功能来提升代码的可读性和灵活性。本文将深入探讨装饰器的概念、用法和实际应用,帮助读者更好地理解并运用这一Python编程的利器。
|
5天前
|
IDE Java 开发工具
讨论 Python 中泛型(或类似泛型的功能)的优点和缺点
Python虽无显式泛型系统,但可通过类型注解和工具实现类似功能。优点包括提升代码可读性、静态类型检查、更好的IDE支持、灵活性和可逐渐引入。缺点涉及运行时性能开销、学习成本、非强制性及与旧代码集成问题。适当使用工具和实践可管理这些挑战。
15 2
|
5天前
|
缓存 并行计算 Serverless
优化Python代码性能的5个技巧
在日常Python编程中,代码性能的优化是一个重要的议题。本文介绍了5个实用的技巧,帮助你提高Python代码的执行效率,包括使用适当的数据结构、优化循环结构、利用内置函数、使用生成器表达式以及并行化处理。通过这些技巧,你可以更高效地编写Python代码,提升程序的性能和响应速度。
|
6天前
|
Python
探索Python中的装饰器:提升代码灵活性与可维护性
Python中的装饰器是一种强大的工具,可以在不改变原有代码结构的情况下,动态地添加功能或修改函数的行为。本文将深入探讨装饰器的原理、常见用法以及如何利用装饰器提升代码的灵活性和可维护性。
|
7天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
7天前
|
数据可视化 Python
python中Copula在多元联合分布建模可视化2实例合集|附数据代码
python中Copula在多元联合分布建模可视化2实例合集|附数据代码