百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

如何定时,周期性的运行程序?Python APScheduler实现任务灵活调度

ccwgpt 2024-09-29 09:52 39 浏览 0 评论

在我们的开发工作中,时常会有这样的开发需求,如需要定时或者周期性的运行某些程序,因此经常用到一些定时服务,如在 Linux系统中使用 Crond 服务实现程序的定时运行。

Python中也有这样的一个模块,那就是 APScheduler,它是基于Quartz 的一个 Python定时任务框架,实现了 Quartz的全部功能,使用起来十分简单、高效。其提供了基于日期、固定时间间隔以及 Crontab类型的任务,并且支持持久化任务。同时也提供了不同的存储机制,可以方便与数据库等第三方的外部持久化存储进行协同工作。它主要包含了四种组件:

  • Triggers:任务触发器,任务以何种方式触发。
  • Job stores:任务存储器,持久存储任务。
  • Executors:任务执行器,执行任务的模块。
  • Schedulers:任务调度器,通过配置 trigger、job store、executor等实现对任务的增删改查等调度控制。

APScheduler安装

安装过程如下:


任务存储器 Job stores

Job stores 存储被调度的任务,默认的任务存储是简单地把任务保存在内存(MemoryJobStore)中,其他的任务存储形式是将任务保存在数据库中。一个任务的数据将在保存在持久化任务存储时被序列化,在加载时被反序列化。调度器不能分享同一个任务存储。job store支持主流的存储机制:redis、mongodb、内存等等。

MongoDBJobStore为例,实例如下:


执行器 Executors

Executors 处理任务的运行,他们通常通过在任务中提交制定的可调用对象到一个线程或者进城池来进行,当任务完成时,执行器将会通知调度器。


调度器 Schedulers

通常在应用只有一个调度器,调度器提供了处理任务存储、调度器、触发器合适的接口。配置任务存储和执行器可以在调度器中完成,例如添加、修改和移除任务。常用的调度器如下:

  • BlockingScheduler:仅可用在当前你的进程之内,与当前的进行共享计算资源,适合于只在进程中运行单个任务的情况,通常在调度器是你唯一要运行的东西时使用。
  • BackgroundScheduler: 在后台运行调度,不影响当前的系统计算运行,适合于要求任何在程序后台运行的情况,当希望调度器在应用后台执行时使用。
  • AsyncIOScheduler: 如果当前系统中使用了async module,则需要使用异步的调度器,适合于使用asyncio框架的情况。
  • GeventScheduler: 如果使用了 gevent,则需要使用该调度,适合于使用 gevent框架的情况。
  • TornadoScheduler: 如果使用了Tornado, 则使用当前的调度器,适合于使用 Tornado框架的应用。
  • TwistedSchedulerTwister应用的调度器,适合使用Twisted框架的应用。
  • QtScheduler: Qt的调度器,适合使用QT的情况。

触发器种类Triggers

Triggers 包含调度逻辑,每一个任务有它自己的触发器,用于决定接下来哪一个任务运行,根据 Triggers 中定义的时间点,执行频率,时间区间等等参数设置。除了他们自己初始配置以外,触发器完全是无状态的,触发器有如下几种:

  • date:一次性任务,即只执行一次任务。
  • interval:循环任务,即按照时间间隔执行任务。
  • cron:定时任务,即在每个时间段执行任务。

interval 触发器实例

指定触发器为 interval,循环任务,即按照 时间间隔 执行任务。

参数如下

  • year (int|str) :表示四位数的年份,如2019年
  • month (int|str) :表示取值范围为1-12月。
  • day (int|str) :表示取值范围为1-31日。
  • week (int|str) :一年中的第几周 (1-53)。
  • day_of_week (int|str) :表示一周中的第几天(0-6)。
  • hour (int|str):表示取值范围为0-23时。
  • minute (int|str) :表示取值范围为0-59分。
  • second (int|str) :表示取值范围为0-59秒。
  • start_date (datetime|str) :表示开始时间。
  • end_date (datetime|str) :表示结束时间。
  • timezone (datetime.tzinfo|str) :表示时区取值。

如上,我们设定 每2秒执行一次,运行结果如下:


date 触发器实例

指定触发器为 date一次性任务,即只执行一次任务。

如上,我们设定任务 延时五秒 后执行,运行结果如下:


cron 触发器实例

指定触发器为 cron,定时任务,即在每个时间段执行任务

参数如下

  • year (int|str) :表示四位数的年份,如2019年
  • month (int|str) :表示取值范围为1-12月。
  • day (int|str) :表示取值范围为1-31日。
  • week (int|str) :一年中的第几周 (1-53)。
  • day_of_week (int|str) :表示一周中的第几天(0-6)。
  • hour (int|str):表示取值范围为0-23时。
  • minute (int|str) :表示取值范围为0-59分。
  • second (int|str) :表示取值范围为0-59秒。
  • start_date (datetime|str) :表示开始时间。
  • end_date (datetime|str) :表示结束时间。
  • timezone (datetime.tzinfo|str) :表示时区取值。

如上,我们设定在2、4月、7~9月,每天晚上22点21分执行一次任务,运行结果如下:


移除、暂停/恢复任务


相关推荐

RACI矩阵:项目管理中的角色与责任分配利器

作者:赵小燕RACI矩阵RACI矩阵是项目管理中的一种重要工具,旨在明确团队在各个任务中的角色和职责。通过将每个角色划分为负责人、最终责任人、咨询人和知情人四种类型,RACI矩阵确保每个人都清楚自己...

在弱矩阵组织中,如何做好项目管理工作?「慕哲制图」

慕哲出品必属精品系列在弱矩阵组织中,如何做好项目管理工作?【慕哲制图】-------------------------------慕哲制图系列0:一图掌握项目、项目集、项目组合、P2、商业分析和NP...

Scrum模式:每日站会(Daily Scrum)

定义每日站会(DailyScrum)是一个Scrum团队在进行Sprint期间的日常会议。这个会议的主要目的是为了应对Sprint计划中的不断变化,确保团队能够有效应对挑战并达成Sprint目标。为...

大家都在谈论的敏捷开发&Scrum,到底是什么?

敏捷开发作为一种开发模式,近年来深受研发团队欢迎,与瀑布式开发相比,敏捷开发更轻量,灵活性更高,在当下多变环境下,越来越多团队选择敏捷开发。什么是敏捷?敏捷是一种在不确定和变化的环境中,通过创造和响应...

敏捷与Scrum是什么?(scrum敏捷开发是什么)

敏捷是一种思维模式和哲学,它描述了敏捷宣言中的一系列原则。另一方面,Scrum是一个框架,规定了实现这种思维方式的角色,事件,工件和规则/指南。换句话说,敏捷是思维方式,Scrum是规定实施敏捷哲学的...

敏捷项目管理与敏捷:Scrum流程图一览

敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示,以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例:这个流程图涵盖了Scrum框架的主要阶段和活动,其中包...

一张图掌握项目生命周期模型及Scrum框架

Mockito 的最佳实践(mock方法)

记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到...

EffectiveJava-5-枚举和注解(java枚举的作用与好处)

用enum代替int常量1.int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种...

Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!

Maven简介Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是一个跨平台的项目管理工具。主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。仔...

Java单元测试框架PowerMock学习(java单元测试是什么意思)

前言高德的技术大佬在谈论方法论时说到:“复杂的问题要简单化,简单的问题要深入化。”这句话让我感触颇深,这何尝不是一套编写代码的方法——把一个复杂逻辑拆分为许多简单逻辑,然后把每一个简单逻辑进行深入实现...

Spring框架基础知识-第六节内容(Spring高级话题)

Spring高级话题SpringAware基本概念Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的。但是在实际的项目中,你的Bean必须要意识到Spring容器...

Java单元测试浅析(JUnit+Mockito)

作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作...

揭秘Java代码背后的质检双侠:JUnit与Mockito!

你有没有发现,现在我们用的手机App、逛的网站,甚至各种智能设备,功能越来越复杂,但用起来却越来越顺畅,很少遇到那种崩溃、卡顿的闹心事儿?这背后可不是程序员一拍脑袋写完代码就完事儿了!他们需要一套严谨...

单元测试框架哪家强?Junit来帮忙!

大家好,在前面的文章中,给大家介绍了以注解和XML的方式分别实现IOC和依赖注入。并且我们定义了一个测试类,通过测试类来获取到了容器中的Bean,具体的测试类定义如下:@Testpublicvoid...

取消回复欢迎 发表评论: