使用Flask和Celery实现Python的每月定时任务

每日自动更新各类学习教程及工具下载合集

​https://pan.quark.cn/s/874c74e8040e​

在现代Web应用中,定时任务是一个非常有用的功能,可以帮助我们自动执行周期性操作,比如数据备份、报告生成或发送定期通知。结合Flask和Celery,我们可以轻松实现这种定时任务。本文将详细介绍如何在Flask应用中使用Celery来创建一个每月定时执行的任务。

1. 环境准备

1.1 安装依赖

首先,确保你已经安装了Flask和Celery。你还需要一个消息代理(通常是RabbitMQ或Redis)。在这里,我们将使用Redis。同时,我们还需要​​Celery[redis]​​来支持Redis作为消息代理。

复制代码
pip install Flask Celery redis

1.2 启动Redis

确保Redis服务正在运行。你可以使用Docker来启动Redis:

复制代码
docker run -p 6379:6379 -d redis

2. 创建Flask应用与Celery配置

2.1 创建Flask应用

首先,创建一个名为​​app.py​​的文件,并设置Flask和Celery:

复制代码
from flask import Flask
from celery import Celery
from celery.schedules import crontab

app = Flask(__name__)

# 配置Celery
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'

celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

@celery.task
def monthly_task():
    print("每月任务执行!")

# 定义定时任务
@celery.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # 每月的第一天的午夜执行任务
    sender.add_periodic_task(crontab(day=1, hour=0, minute=0), monthly_task.s())

# Flask路由
@app.route('/')
def index():
    return "Flask与Celery定时任务示例"

if __name__ == '__main__':
    app.run(debug=True)

2.2 代码解析

  1. Flask应用: 创建一个简单的Flask应用,定义了根路由返回一段文本。
  2. Celery配置:
  • ​CELERY_BROKER_URL​: 指定消息代理为Redis。
  • ​CELERY_RESULT_BACKEND​: 指定Celery的结果后端为Redis。
  1. 任务定义 : 使用@celery.task装饰器定义一个名为monthly_task的任务,当任务执行时,将打印一条信息。
  2. 定时任务设置 : 使用@celery.on_after_configure.connect装饰器,在Celery配置后添加一个定时任务,这里我们定义了每月的第一天的午夜(00:00)执行monthly_task

2.3 运行Flask应用

运行Flask应用:

复制代码
python app.py

3. 启动Celery工作进程

为了处理Celery任务,我们需要启动Celery工作进程。在另一个终端中,导航到你的项目目录并运行以下命令:

复制代码
celery -A app.celery worker --loglevel=info

4. 启动Celery Beat

Celery Beat是一个调度器,用于定期发送任务。我们需要在另一个终端中运行它:

复制代码
celery -A app.celery beat --loglevel=info

5. 测试定时任务

在这个设置中,我们已经定义了一个每月执行的任务。要验证任务是否按预期执行,你可以查看Celery工作进程的输出,任务应该会在每月的第一天的午夜被执行,并打印"每月任务执行!"。

5.1 示例输出

在Celery工作进程的终端中,你应该会看到如下输出(假设当前日期是一个月的第一天):

复制代码
[2023-10-01 00:00:00,000: INFO/MainProcess] Task app.monthly_task[<task_id>] succeeded in 0.001s: None
每月任务执行!

6. 结果验证

每次任务执行时,都会在工作进程的控制台上打印"每月任务执行!"。你可以根据需要将该任务替换为其他功能,比如发送电子邮件、生成报告等。

7. 总结

通过结合Flask和Celery,我们成功地实现了一个每月定时任务。Celery提供了强大的调度机制,支持灵活的任务安排和异步执行,使得在Web应用中处理定时任务变得简单高效。在实际应用中,你可以根据需求调整任务的复杂性和执行频率。

相关推荐
Python图像识别10 分钟前
71_基于深度学习的布料瑕疵检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
千码君20161 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
淮北4942 小时前
windows安装minicoda
windows·python·conda
爱喝白开水a3 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
默默coding的程序猿5 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea
新子y6 小时前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
我是李武涯7 小时前
PyTorch DataLoader 高级用法
人工智能·pytorch·python
Lynnxiaowen7 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
ThreeAu.7 小时前
pytest 实战:用例管理、插件技巧、断言详解
python·单元测试·pytest·测试开发工程师
资源补给站8 小时前
服务器高效操作指南:Python 环境退出与 Linux 终端快捷键全解析
linux·服务器·python