celery/schedules.py源码精读

BaseSchedule类

基础调度类,它定义了一些调度任务的基本属性和方法。以下是该类的主要部分的解释:

  • __init__(self, nowfun: Callable | None = None, app: Celery | None = None):初始化方法,接受两个可选参数,nowfun表示返回当前时间的函数,app表示Celery应用程序的实例。
  • now(self) -> datetime:返回当前时间的方法。它使用了nowfun属性或者Celery应用程序的now方法。
  • remaining_estimate(self, last_run_at: datetime) -> timedelta:估计下一次运行的时间间隔。这是一个抽象方法,需要在子类中实现。
  • is_due(self, last_run_at: datetime) -> tuple[bool, datetime]:判断任务是否到期的方法。这也是一个抽象方法,需要在子类中实现。
  • maybe_make_aware(self, dt: datetime, naive_as_utc: bool = True) -> datetime:将时间转换为可能的时区感知时间。它使用了Celery应用程序的时区信息。
  • app属性:获取或设置与调度相关联的Celery应用程序实例。
  • tz属性:获取或设置调度任务的时区信息。
  • utc_enabled属性:获取或设置UTC是否启用的信息。
  • to_local(self, dt: datetime) -> datetime:将时间转换为本地时间。如果UTC启用,则将时间转换为本地时间;否则,使用回退方式将时间转换为本地时间。
  • __eq__(self, other: Any) -> bool:判断两个调度任务是否相等的方法。比较的依据是nowfun属性。

这个类提供了一些基本的调度任务功能,并定义了一些抽象方法,具体的调度任务类需要继承这个基类并实现这些抽象方法。

schedule类

用于表示Celery中的周期性任务调度

  1. 构造函数 (__init__ 方法):

    • 通过构造函数接受一些参数,包括 run_every(任务的运行间隔时间)、relative(一个布尔值,表示是否将运行时间舍入到间隔的分辨率)、nowfun(返回当前日期和时间的函数)、app(Celery应用实例)。
    • 使用 super().__init__(nowfun=nowfun, app=app) 调用父类(BaseSchedule)的构造函数。
  2. remaining_estimate 方法:

    • 计算距离下一次运行任务的剩余时间。
    • 使用 remaining 函数,传递上次运行时间、运行间隔、当前时间以及 relative 标志。
    • relative =True,当前时间是9.36,则会舍入到最近的30分的倍数10:00第一次执行,然后10:30,11:30…
    • relative =False则不做舍入,当前时间是9.36,则9.36第一次执行,然后10:06,11:36…
  3. is_due 方法:

    • 根据上次运行时间确定任务是否应该运行。
    • 返回一个包含布尔值(is_due,表示任务是否应该运行)和下一次检查的时间(以秒为单位)的元组。
  4. __repr__ 方法:

    • 返回对象的字符串表示,指示任务的频率以人类可读的格式显示。
  5. __eq__ 方法:

    • 实现相等性比较,允许对此类的实例进行比较。
  6. __reduce__ 方法:

    • 用于序列化。返回一个元组,可用于重新创建对象。
  7. seconds 属性:

    • 返回运行间隔的总秒数。
  8. human_seconds 属性:

    • 返回表示运行间隔秒数的人类可读字符串。

这个类看起来设计得很好,用于定义Celery框架中任务的周期性调度。它包括用于估算剩余时间、检查任务是否应该运行以及提供可读的调度表示的方法。

crontab_parser类

用于解析类似于Crontab表达式的字符串。Crontab表达式通常用于指定计划任务(定时任务)运行的时间规则。下面是对该类的主要解释:

  • 构造函数 (__init__):

    • 初始化 crontab_parser 对象。可以通过构造函数指定最大值和最小值,默认为 max_=60min_=0
    • 构造函数还设置了一系列正则表达式和相应的处理函数,这些正则表达式用于匹配不同的 Crontab 表达式模式。
  • parse 方法:

    • 接受一个 Crontab 表达式字符串,返回一个包含时间单位的集合。例如,parse('*/15') 返回 [0, 15, 30, 45]
  • 私有方法 (_parse_part, _expand_range, _range_steps, _star_steps, _expand_star, _expand_number):

    • 这些方法用于解析和展开不同类型的 Crontab 表达式部分。
    • _parse_part 方法遍历已解析的 Crontab 表达式部分,使用正则表达式匹配相应的模式,并调用相应的处理函数。
    • _expand_range 方法用于展开范围,例如 1-5 展开为 [1, 2, 3, 4, 5]
    • _range_steps 方法处理带步长的范围,例如 1-5/2 展开为 [1, 3, 5]
    • _star_steps 方法处理带步长的星号,例如 */2 展开为 [0, 2, 4, ..., max_]
    • _expand_star 方法展开星号,例如 * 展开为 [min_, min_+1, ..., max_]
    • _expand_number 方法用于展开数字,同时检查数字的有效性。

这个类的目的是解析 Crontab 表达式中的不同部分,将其展开为对应的时间单位集合。通过这样的解析,可以获取计划任务运行的时间规则。

crontab类

Celery 中 Crontab 调度的实现,用于定义基于类似于 cron 的时间表的任务执行规则,主要负责解析 Crontab 表达式,计算下一次任务运行的时间,以及判断任务是否应该运行。Crontab 表达式中的星号和数字表示通配符,可以非常灵活地定义任务的运行时间。

class crontab(BaseSchedule):# ...(文档字符串中有详细的描述)def __init__(self, minute: str = '*', hour: str = '*', day_of_week: str = '*',day_of_month: str = '*', month_of_year: str = '*', **kwargs: Any) -> None:# 初始化 Crontab 实例,接受分钟、小时、星期几、每月的第几天和每年的第几月等参数# 参数可以是数字、字符串(Crontab 表达式)或可迭代对象(例如列表、集合)# 使用 crontab_parser 来解析字符串表达式# _expand_cronspec 方法用于展开 cronspec,确保值在合理范围内def _expand_cronspec(cronspec: int | str | Iterable,max_: int, min_: int = 0) -> set[Any]:# 展开 cron 规范,将字符串表达式转换为一个集合,表示 Crontab 触发的所有时间单位值def _delta_to_next(self, last_run_at: datetime, next_hour: int,next_minute: int) -> ffwd:# 找到下一个 delta(时间间隔),用于计算下一次调度的时间# 主要用于在限制任务执行的 day_of_month 和/或 month_of_year cronspec 时def __repr__(self) -> str:# 返回 Crontab 的字符串表示形式def remaining_delta(self, last_run_at: datetime, tz: tzinfo | None = None,ffwd: type = ffwd) -> tuple[datetime, Any, datetime]:# 计算距离下一次执行的时间间隔# 用于 day_of_month 和/或 month_of_year cronspec 的任务调度def remaining_estimate(self, last_run_at: datetime, ffwd: type = ffwd) -> timedelta:# 估算下一次运行时间,返回 timedeltadef is_due(self, last_run_at: datetime) -> tuple[bool, datetime]:# 返回一个元组,表示任务是否应该运行和下一次运行的时间# 考虑了 beat_cron_starting_deadline 配置,确保在 deadline 内执行def __eq__(self, other: Any) -> bool:# 判断两个 Crontab 实例是否相等

maybe_schedule函数

用于将输入参数转换为 Celery 中的调度对象(BaseSchedule 类的实例),输入参数可以是整数(表示秒数)、浮点数(表示秒数)、timedelta 对象(表示时间间隔)或者已有的调度对象。如果输入是整数或浮点数,会先将其转换为 timedelta 对象,然后创建一个调度对象。如果输入已经是 timedelta 对象,则直接创建一个调度对象。如果输入是已有的调度对象,则设置其 Celery app 属性后返回。

def maybe_schedule(s: int | float | timedelta | BaseSchedule, relative: bool = False,app: Celery | None = None) -> float | timedelta | BaseSchedule:"""Return schedule from number, timedelta, or actual schedule."""if s is not None:if isinstance(s, (float, int)):# 如果输入是整数或浮点数,将其转换为 timedelta 对象s = timedelta(seconds=s)if isinstance(s, timedelta):# 如果输入是 timedelta 对象,创建一个 schedule 实例return schedule(s, relative, app=app)else:# 如果输入是 BaseSchedule 的实例,设置其 Celery app 属性s.app = appreturn s

solar类

用于处理太阳事件的 Celery 调度器的类。允许你创建一个周期性任务,该任务将根据特定的太阳事件进行调度。太阳事件的种类包括黎明、日出、日中、日落和黄昏等,你可以选择其中一个事件作为任务的触发条件。在初始化时,你需要指定事件类型(event)、观察者的纬度(lat)和经度(lon),以及其他一些可选参数。类中的方法包括 remaining_estimate(返回下一次运行的时间估计)和 is_due(返回任务是否应该运行及下一次运行的时间)。此外,还有一些辅助性的属性和方法,用于表示太阳事件的集合、地平线高度、计算方法等。

class solar(BaseSchedule):"""Solar event.A solar event can be used as the ``run_every`` value of aperiodic task entry to schedule based on certain solar events....Arguments:event (str): Solar event that triggers this task.See note for available values.lat (float): The latitude of the observer.lon (float): The longitude of the observer.nowfun (Callable): Function returning the current date and timeas a class:`~datetime.datetime`.app (Celery): Celery app instance."""_all_events = {...}  # 一组表示所有可能太阳事件的字符串集合_horizons = {...}  # 一组表示各种太阳事件时,地平线的高度_methods = {...}  # 一组表示用于计算太阳事件的方法_use_center_l = {...}  # 一组表示是否使用太阳中心计算的布尔值def __init__(self, event: str, lat: int | float, lon: int | float, **kwargs: Any) -> None:# 初始化太阳事件调度器...def remaining_estimate(self, last_run_at: datetime) -> timedelta:"""Return estimate of next time to run.Returns:~datetime.timedelta: when the periodic task shouldrun next, or if it shouldn't run today (e.g., the sun doesnot rise today), returns the time when the next checkshould take place."""# 返回下一次运行的时间估计...def is_due(self, last_run_at: datetime) -> tuple[bool, datetime]:"""Return tuple of ``(is_due, next_time_to_run)``.Note:next time to run is in seconds.See Also::meth:`celery.schedules.schedule.is_due` for more information."""# 返回是否应该运行及下一次运行的时间...def __eq__(self, other: Any) -> bool:if isinstance(other, solar):return (other.event == self.event andother.lat == self.lat andother.lon == self.lon)return NotImplemented

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java的医院住院管理系统的设计与实现论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对医院住院信息管理混乱,出错率高,信息安全性差…

Java中使用EasyExcel写excel文件

1、公式 package com.web.report.handler;import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.metadata.csv.CsvCellStyle; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import…

Vue学习笔记-Vue3中的customRef

作用 创建一个自定义的ref&#xff0c;并对其依赖项的更新和触发进行显式控制 案例 描述&#xff1a;向输入框中输入内容&#xff0c;在下方延迟1秒展示输入内容 代码&#xff1a; <template><input type"text" v-model"keyword"><h3&…

从零开发短视频电商 用Java框架部署模型并推理 - Deep Java Library (DJL)

文章目录 支持引擎模型库示例一 基础模型 图片分类示例二 huggingface模型库 文本嵌入获取Tokenization标记(tokens)的数量官网: https://djl.ai/ 动手学深度学习-中文:https://d2l-zh.djl.ai/ 支持模型 PyTorch TorchScript modelTensorFlow SavedModel bundleApache MXNe…

Spring 使用 MongoDB 时的数据类型转换器

官方文档&#xff1a;自定义类型转换器 是时间戳为例的代码&#xff1a; TimestampReadConverter.java import org.bson.BsonTimestamp; import org.springframework.core.convert.converter.Converter;import java.time.Instant; import java.util.Date;/* * Java类型与 Mo…

网络安全项目实战(四)--报文检测

8. TCP/UDP 段 目标 了解 TCP 段头的组织结构了解 UDP 段头的组织结构掌握 TCP/UDP 段的解析方式 8.1. UDP 段格式 下图是UDP的段格式&#xff08;该图出自[TCPIP]&#xff09;。 8.2. UDP头部 //UDP头部&#xff0c;总长度8字节// /usr/include/linux/udp.h struct udphdr …

uniapp提交带有弹出确认和取消按钮方法提交接口

目录 方法1方法2最后 方法1 submitServie(){let self this;if (!self.resultData.item && !self.resultData.subItem) {uni.showToast({title: 请选择服务分类,duration: 1000,icon: none});return false;}uni.showModal({title: 提示,content: 确定提交&#xff1f;…

自定义Axure元件库及原型图泳道图的绘制(详细不同类的案例)

目录 前言 一.自定义元件库 1.1 自定义元件库的作用 1.2 自定义元件的操作 二.流程图 2.1 流程图的作用 2.2 绘制流程图 2.3 简易流程图案例 三.泳道图 3.1 泳道图的作用 3.2 流程图和泳道图的区别 3.3 绘制泳道图 四.绘制前的准备 五.案例 4.1 门诊模块案例 4.2 …

聚观早报 |iOS17.3引入设备被盗保护;iPhone16或调整设计

【聚观365】12月14日消息 iOS17.3引入设备被盗保护 iPhone16或调整设计 马斯克星链网络使用量飙升 华为鸿蒙智行App正式上线 特斯拉人形机器人Optimus二代上线 iOS17.3引入设备被盗保护 苹果向iPhone用户推送了iOS17.3开发者预览版Beta更新&#xff0c;本次更新距离上次发…

Vue2.x源码:new Vue()做了啥

例子1new Vue做了啥?new Vue做了啥,源码解析 initMixin函数 初始化 – 初始化Vue实例的配置initLifecycle函数 – 初始化生命周期钩子函数initEvents – 初始化事件系统初始化渲染 initRender初始化inject选项 例子1 <div id"app"><div class"home&…

docker安装最新版SQL Server并还原备份的数据库

docker安装数据库 拉取微软官方最新版镜像 docker pull mcr.microsoft.com/mssql/server 拉去镜像并创建容器 docker run -e "ACCEPT_EULAY" -e "SA_PASSWORDsa_password_123456" -p 1433:1433 -v /opt/:/opt --name sqlserver -d mcr.microsoft.com/ms…

前端页面显示的时间格式为:2022-03-18T01:46:08.000+00:00 如何转换为:年-月-日,并根据当前时间判断为几天前

由于后端每条博文的发表时间是以“xxxx—xx—xxxx:xx:xx”的形式显示的&#xff0c; 现在要在前端改成“xxxx年xx月xx日”的形式。 并对10分钟内发表的显示“刚刚”&#xff0c;对24小时内发表的显示“小时前”。 超过24小时&#xff0c;小于48小时&#xff0c;显示“1天前”。…

生产实践:基于K8S的私有化部署解决方案

随着国内数字化转型的加速和国产化进程推动&#xff0c;软件系统的私有化部署已经成为非常热门的话题&#xff0c;因为私有化部署赋予了企业更大的灵活和控制权&#xff0c;使其可以根据自身需求和安全要求定制和管理软件系统。下面分享下我们的基于k8S私有化部署经验。 私有化…

Nginx 服务器安装及配置文件详解

1. 安装nginx 1.1 选择稳定版本 我们编译安装nginx来定制自己的模块&#xff0c;机器CentOS 6.2 x86_64。首先安装缺少的依赖包&#xff1a; # yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话…

如何使用EXCEL制作一份高效、美观的成绩单

要制作一份高效、美观的成绩单&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开Excel软件&#xff0c;创建一个新的工作簿。 2. 在工作簿中创建一个新的工作表&#xff0c;可以点击工作簿底部的""按钮&#xff0c;或者使用快捷键"Shift F11"。…

第一周:AI产品经理跳槽准备工作

一、筛选意向行业 因素1:行业发展情况 因素2:工作经验优势 技术背景:计算机视觉、人工智能、敏捷管理产品背景:2B、2C、跨境电商、平台工具、SAAS领域:国内、跨境行业:教育、新零售、电商相关项目:数据分析工具、在线编程平台OJ、线下新零售系统、订单交易履约、跨境E…

VS2022配置C++ 20解决import std报错

C 20新特征支持用import std来导入std模块&#xff0c;如下&#xff1a; 配置时主要有两个步骤&#xff1a; &#xff08;1&#xff09;项目--属性--常规--C语言标准--预览 - 最新 C 工作草案中的功能 (/std:clatest) 注意选择ISO C20 标准 (/std:c20)也不能正常使用&#xf…

【PgSQL】导出表结构为EXCEL

详细SQL语句&#xff1a; C.relname ‘你的表名’ 直接输入表面即可 PgSQL 打印表结构语句 SELECT C.relname AS "表名",CAST(obj_description(C.oid, pg_class) AS VARCHAR) AS "表名描述",A.attname AS "字段名",CASE WHEN A.attnotnull f …

(C++)无重复字符的最长子串--滑动窗口

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

Oracle存储过程打印输出错误信息、行号,快速排查

测试存储过程如下&#xff1a; create or replace procedure prc_test isp_1 varchar2(2); beginp_1 : lxw测试;exceptionwhen others thendbms_output.put_line(sqlcode); --Oracle内置变量&#xff0c;错误代码dbms_output.put_line(sqlerrm); --Oracle内置变量&#xff0c;…