Python 常用定时任务框架介绍及代码举例

文章目录

  • Python 常用定时任务框架简介
      • 🧩 一、轻量级方案(适合简单任务)
        • 1. **`schedule`库**
      • ⚙️ 二、中级方案(平衡功能与复杂度)
        • 2. **APScheduler**
        • 3. **Celery + Celery Beat**
      • 🚀 三、异步专用方案(高性能I/O密集型)
        • 4. **AsyncIOScheduler(APScheduler子类)**
        • 5. **aiocron**
      • 🔍 四、框架横向对比
      • ⚠️ 五、避坑指南
      • 💎 总结

Python 常用定时任务框架简介

以下是对Python主流定时任务框架的详细对比及使用指南,我们可结合场景需求可快速定位合适方案:


🧩 一、轻量级方案(适合简单任务)

1. schedule
  • 特点:语法直观,无需复杂配置,适合小型脚本或低频任务。

  • 安装

    uv add schedule
    
  • 示例代码

    import schedule
    import timedef job():print(f"Task executed at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 每10秒钟执行一次
    schedule.every(10).seconds.do(job)
    # 每天16:00执行
    schedule.every().day.at("16:00").do(job)while True:schedule.run_pending()time.sleep(1)
    

    schedule

  • 适用场景:单机脚本、低频任务(如每日报表生成)。

  • 缺点:不支持持久化或动态任务管理。


⚙️ 二、中级方案(平衡功能与复杂度)

2. APScheduler
  • 核心优势

    • 支持三种触发器:interval(固定间隔)、cron(类Linux Cron语法)、date(单次任务)。
    • 可持久化任务到数据库(SQLite/MongoDB/Redis等)。
    • 提供异步调度器(AsyncIOScheduler)兼容asyncio
  • 安装

    uv add apscheduler
    
  • 示例代码

    from apscheduler.schedulers.background import BackgroundScheduler
    import timedef job():print(f"Task executed at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 创建调度器
    scheduler = BackgroundScheduler()
    # 每20秒执行(interval模式)
    scheduler.add_job(job, 'interval', seconds=20)
    # 每天16点08分执行(cron模式)
    scheduler.add_job(job, 'cron', hour=16, minute=8)scheduler.start()
    try:while True:time.sleep(2)
    except KeyboardInterrupt:scheduler.shutdown()
    

    apscheduler

  • 适用场景:需动态增删任务(如Web后台定时任务)、复杂调度逻辑(如每月最后一个工作日)。

3. Celery + Celery Beat
  • 特点:分布式任务队列,天然支持异步和横向扩展,需搭配消息中间件(如Redis/RabbitMQ)。

  • 安装

    uv add celery
    

    本文使用Redis故需要安装上含有Redis访问库的版本,否则访问Redis会报错,使用如下语句:

    uv add celery[redis]
    
  • 示例代码

      # tasks.pyfrom celery_app import app@app.taskdef add(x: int, y: int) -> int:result = x + yprint("add task result ", result)return result@app.taskdef multiply(x: int, y: int) -> int:result = x * yprint("multiply task ", result)return result# celery_app.pyfrom celery import Celeryfrom celery.schedules import crontabapp = Celery('celery_app', broker='redis://localhost:6379/0')# 设置时区为东八区app.conf.timezone = 'Asia/Shanghai'app.conf.update(result_backend='redis://localhost:6379/0',beat_schedule={'add-every-10-seconds': {'task': 'tasks.add','schedule': 10.0, # run every 10 seconds'args': (10, 10)},'multiply-at-1715': {'task': 'tasks.multiply','schedule': crontab(hour='17', minute='15'),'args': (4, 5)}},include=['tasks'])    
    

    该方案执行起来相对复杂了些:

    1. 首先启动 Celery worker:celery -A celery_app worker --loglevel=info

    2. 【可选】如需观察定时任务自动运行,可启动 Celery beat:celery -A celery_app beat --loglevel=info

    3. 你也可以通过运行脚本手动触发任务

    celery

    # main.py
    from tasks import add if __name__ == "__main__":result = add.delay(4, 5)print('Task result: ', result.get())
    
  • 适用场景:分布式系统、高可用需求(如微服务集群定时任务)。


🚀 三、异步专用方案(高性能I/O密集型)

4. AsyncIOScheduler(APScheduler子类)
  • 用途:在异步环境中调度协程任务。

  • 示例

    from apscheduler.schedulers.asyncio import AsyncIOScheduler
    import asyncio
    import time
    import osdef tick():print(f"Tick! The time is: {time.strftime('%Y-%m-%d %H:%M:%S')}")async def main():scheduler = AsyncIOScheduler()scheduler.add_job(tick, 'interval', seconds=5)scheduler.start()print("Press Ctrl+{} to exit".format("Break" if os.name == "nt" else "C"))while True:await asyncio.sleep(1000)if __name__ == "__main__":# Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.try:asyncio.run(main())except (KeyboardInterrupt, SystemExit):pass   
    

    async

5. aiocron
  • 特点:极简异步Cron调度器,语法类似Unix cron。

  • 安装

    uv add aiocron
    
  • 示例

    import asyncio
    import datetime
    import aiocron# 定义一个简单的异步函数
    async def attime_job():"""这个协程会每分钟被调用一次。"""print(f"[{datetime.datetime.now()}] 你好,世界!这是一个每分钟执行的任务。")# 定义另一个需要参数的异步函数
    async def attime_job_with_args(name):"""这个协程会在每小时的第5分钟被调用。"""print(f"[{datetime.datetime.now()}] 你好,{name}!这是一个带参数的任务。")await asyncio.sleep(1) # 模拟一些 I/O 操作print(f"[{datetime.datetime.now()}] {name} 的任务执行完毕。")if __name__ == '__main__':print("程序启动,等待定时任务执行... (按 Ctrl+C 退出)")# 1. 创建一个每分钟执行的 cron 任务 ('* * * * * *')# cron 格式: a b c d e# a: 分钟 (0-59)# b: 小时 (0-23)# c: 日 (1-31)# d: 月 (1-12)# e: 周几 (0-6, 0是周日)aiocron.crontab('* * * * *', func=attime_job)# 2. 创建一个在每小时的第 5 分钟执行的任务#    并向任务函数传递参数 'Python'aiocron.crontab('5 * * * *', func=attime_job_with_args, args=('Python',))# 创建并运行 asyncio 事件循环# loop.run_forever() 会一直运行,直到被停止loop = asyncio.get_event_loop()try:loop.run_forever()except KeyboardInterrupt:print("\n程序被用户中断。")finally:loop.close()print("事件循环已关闭。")
    

    aiocron


🔍 四、框架横向对比

框架适用场景异步支持持久化分布式学习成本
schedule小型脚本、低频任务
APScheduler单机复杂调度、动态任务管理✅(选配)⭐⭐
Celery + Beat分布式系统、高可用场景⭐⭐⭐
AsyncIOScheduler异步应用(如FastAPI/Starlette)⭐⭐
aiocron极简异步定时任务

💎 推荐策略

  • 快速验证或简单脚本 → schedule
  • 单机复杂调度(如动态启停任务) → APScheduler
  • 分布式生产环境 → Celery
  • 异步应用(如FastAPI) → AsyncIOScheduler

⚠️ 五、避坑指南

  1. 阻塞问题
    • 避免在同步调度器(如BackgroundScheduler)中调用耗时同步任务,否则会阻塞主线程。异步任务需用AsyncIOScheduler
  2. 持久化配置
    • APScheduler若需重启后保留任务,务必配置jobstore(如SQLite)。
  3. 时区陷阱
    • 所有调度器默认使用UTC时间,需显式设置时区(如scheduler = BackgroundScheduler(timezone="Asia/Shanghai"))。

💎 总结

根据场景复杂度与规模选择框架:轻量级选schedule,单机灵活调度用APScheduler,分布式系统用Celery,异步生态选AsyncIOScheduleraiocron。务必注意任务持久化和时区配置,避免生产环境故障。

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

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

相关文章

使用redis服务的redisson架构实现分布式锁

加锁 /*** 尝试为指定的许可证 ID 获取分布式锁。如果锁已被占用,则立即抛出业务异常。** param licenseId 需要加锁的许可证 ID(即锁名称)* return true 表示成功获取锁,但请注意:* 锁实际持有时间为 30 秒…

HTML表格元素

HTML表格元素深度解析与实战应用 一、表格基本结构与语义化 1. 基础表格元素详解 <table> 容器元素 核心作用&#xff1a;定义表格容器重要属性&#xff1a; border&#xff1a;已废弃&#xff0c;应使用CSS设置边框aria-label/aria-labelledby&#xff1a;为屏幕阅读…

如何使用 Dockerfile 创建自定义镜像

使用 Dockerfile 创建自定义镜像的过程非常清晰&#xff0c;通常包括定义基础镜像、安装依赖、复制代码、设置环境变量和启动命令等步骤。下面详细讲解从零创建自定义镜像的完整流程。 一、什么是 Dockerfile&#xff1f; Dockerfile 是一个文本文件&#xff0c;定义了如何构建…

设置AWS EC2默认使用加密磁盘

问题 EC2磁盘需要使用默认加密。这里需要设置一下默认加密。 EC2

【树的概念及其堆的实现】

树的概念及其堆的实现 1.树的概念2.树的相关概念3.二叉树的概念4. 满二叉树和完全二叉树5.二叉树的存储结构6.二叉树顺序结构的实现的7.堆的结构及其实现 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系…

鸿蒙系统(HarmonyOS)经典红色风格登录页布局

预览 简介 基于鸿蒙系统&#xff08;HarmonyOS&#xff09;开发的现代化登录界面&#xff0c;采用了科技感十足的红色主题设计。该界面结合了流畅的动画效果、精心设计的视觉元素和人性化的交互体验&#xff0c;为用户提供了一个安全、美观且易用的登录入口。 &#x1f3a8; …

C++虚函数多态

class C{ public:void x1(){};void x2(){};};C c; cout << sizeof(c) <<"\n";1字节 class D{ public:void x1(){};void x2(){};virtual void x3(){};//void *vptr看不见的虚函数表指针 }; D d; cout << sizeof(d) <<"\n";8字节类A…

新编辑器编写指南--给自己的备忘

欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

目标检测neck算法之MPCA和FSA的源码实现

目标检测neck算法之MPCA和FSA的源码实现 使用BIBM2024 Spatial-Frequency Dual Domain Attention Network For Medical Image Segmentation的Frequency-Spatial Attention和Multi-scale Progressive Channel Attention改进neck. 接下来&#xff0c;我将讲解它的源码操作的实现…

MyBatis-Plus的3.5.7和PageHelper的那个版本对应

MyBatis-Plus的3.5.7和PageHelper的那个版本对应 根据你的知识库中提到的信息&#xff1a; MyBatis-Plus 3.5.7 使用的是 JSqlParser 4.6 版本。PageHelper 若使用了不同版本的 JSqlParser&#xff08;如 4.7&#xff09;&#xff0c;会导致冲突。 ✅ 推荐对应关系 为了保证…

Apifox 6 月产品更新|支持 AI 能力、交互优化、在线文档新增 SEO 设置、gRPC 项目支持前/后置操作

在 2025 年的 API 开发领域&#xff0c;Apifox 作为一款集 API 设计、调试、Mock 和测试于一体的协作平台&#xff0c;已成为开发者的“得力助手”。然而&#xff0c;随着业务需求的不断增长&#xff0c;开发者对工具的效率和功能提出了更高的要求。6 月份&#xff0c;Apifox 推…

Acrobat JavaScript 从浏览器到 PDF 环境的转换

目录 什么是 JavaScript?JavaScript 核心语言与 Acrobat 特定 API学习 JavaScript 核心语言的挑战浏览器与 Acrobat JavaScript 的关键差异在 Acrobat 中运行 JavaScript 代码替代浏览器特定函数的方法后续学习建议什么是 JavaScript? JavaScript 最初于 1995 年作为 Netsca…

OpenCV CUDA模块设备层-----指数运算函数exp()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 设备端数学函数 中的一个内联函数&#xff0c;用于在 GPU 上对 uchar1 类型&#xff08;单通道图像像素&#xff09;执行指数运算…

C++面向对象5——C++关键字、构造函数与拷贝构造函数

this关键字 C关键字this的深度解析 1. this指针的本质 在C中&#xff0c;this是一个特殊的隐式指针&#xff0c;它存在于每个非静态成员函数内部&#xff0c;指向调用该函数的当前对象。其类型为&#xff1a; 对于非const成员函数&#xff1a;ClassName* const&#xff08;…

人工智能专业:探索未来的智慧前沿

亲戚家的小孩刚高考完&#xff0c;问我人工智能专业是学什么、做什么的。趁机就写一篇吧&#xff01; 人工智能专业&#xff1a;探索未来的智慧前沿 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;无疑是当今最热门、最具颠覆性的技术之一。它正…

618风控战升级,瑞数信息“动态安全+AI”利剑出鞘

每年的618电商促销季&#xff0c;都是各大电商平台和商家的兵家必争之地。数以亿计的消费者涌入线上平台&#xff0c;期待已久的优惠券、秒杀商品如潮水般涌现&#xff0c;海量交易在瞬间达成&#xff0c;无疑是一场商业狂欢。 然而&#xff0c;在这场狂欢背后&#xff0c;自动…

神经网络的架构

神经网络中的基本术语 以上图为例&#xff0c;相关的术语描述如下&#xff1a; 最左边的称为输⼊层&#xff0c;其中的神经元称为输⼊神经元&#xff1b;最右边的&#xff0c;即输出层包含有输出神经元&#xff1b;本例中的输出神经元只有一个&#xff1b;中间层&#xff0c;既…

安全生产监测预警系统:构筑智能化的安全防线

安全生产监测预警系统是工业安全管理的核心工具&#xff0c;它利用物联网、大数据、人工智能等技术&#xff0c;实现对生产环境、设备运行和人员行为的全方位监测&#xff0c;确保风险早发现、早预警、早处置。其核心功能涵盖实时监测、智能预警、应急处置、数据分析与优化等多…

Java练习题精选6-10

Java练习题精选6-10 一、第六题二、第七题第八题第九题第十题 一、第六题 如何将两个变量的值进行交换&#xff1f;假设变量a1&#xff0c;b2。 public class Main {public static void main(String[] args) {int a 1;int b 2;int tmp;System.out.println("交换前a&qu…

【GESP】C++四级考试大纲知识点梳理, (2) 结构体和二维数组

GESP C四级官方考试大纲中&#xff0c;共有11条考点&#xff0c;本文针对第2条考点进行分析介绍。 &#xff08;2&#xff09;掌握 C结构体、二维及多维数组的基本概念及使用 四级其他考点回顾&#xff1a; 【GESP】C四级考试大纲知识点梳理, (1) 指针 全文详见&#xff1a;【G…