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

在今天的开发中,定时任务是一个非常常见的需求。通过 Flask 与 Celery,可以轻松地调度定时任务。本文将引导你如何实现“每月定时任务”。

流程概览

下面的表格展示了实现每月定时任务的主要步骤:

步骤描述
1. 安装依赖安装 Flask、Celery 和所需的依赖
2. 创建 Flask 应用创建一个基本的 Flask 应用
3. 配置 Celery设置 Celery 作为任务管理的中间件
4. 创建任务编写需要周期性执行的任务
5. 设置定时调度使用 Celery Beat 实现定时任务的调度
6. 启动服务启动 Flask 服务和 Celery worker 执行任务

详细步骤

1. 安装依赖

首先,通过 pip 安装 Flask 和 Celery。

pip install Flask celery redis
  • 1.

注:我们使用 Redis 作为 Celery 的消息代理。

2. 创建 Flask 应用

接下来,创建一个基本的 Flask 应用。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "欢迎来到 Flask 应用!"

if __name__ == '__main__':
    app.run(debug=True)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

这个简单的 Flask 应用返回一个欢迎消息。

3. 配置 Celery

现在,我们设置 Celery。创建一个名为 celery_app.py 的文件。

from celery import Celery

def make_celery(app):
    celery = Celery(
        app.import_name,
        backend=app.config['CELERY_RESULT_BACKEND'],
        broker=app.config['CELERY_BROKER_URL']
    )
    celery.conf.update(app.config)
    return celery

app.config.update(
    CELERY_BROKER_URL='redis://localhost:6379/0',
    CELERY_RESULT_BACKEND='redis://localhost:6379/0'
)

celery = make_celery(app)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

上述代码设置了 Celery 客户端,包括使用 Redis 作为消息代理。

4. 创建任务

现在,我们可以创建一个定时任务。在 celery_app.py 文件中添加以下代码:

import datetime

@celery.task
def monthly_task():
    print(f"每月定时任务执行于: {datetime.datetime.now()}")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

monthly_task 是我们需要定期执行的任务,它会打印出当前时间。

5. 设置定时调度

创建一个名为 tasks.py 的文件,配置 Celery Beat 请求任务的时间表:

from celery.schedules import crontab

celery.conf.beat_schedule = {
    'monthly-task': {
        'task': 'celery_app.monthly_task',
        'schedule': crontab(day_of_month='1', hour=0, minute=0),  # 每月1日的0点执行
    },
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这个配置设置了一个定时任务,将在每月的第一天午夜执行。

6. 启动服务

要启动 Flask 应用和 Celery worker,使用以下命令:

# 启动 Flask 应用
python flask_app.py

# 启动 Celery worker
celery -A celery_app.celery worker --loglevel=info

# 启动 Celery Beat
celery -A celery_app.celery beat --loglevel=info
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这三条命令分别启动 Flask 应用、Celery worker 和 Celery Beat。

序列图

以下是系统的交互序列图:

Redis Celery Flask User Redis Celery Flask User 请求任务 执行任务 提交任务 确认任务 执行定时任务

饼状图

假设我们的任务类型如下,使用饼状图展示任务执行状态。

任务执行状态 75% 15% 10% 任务执行状态 成功 失败 待定

结论

使用 Flask 和 Celery 创建和管理每月定时任务是一个非常实用的技能。本教程详细介绍了从设置环境到实现具体功能的每一个步骤。希望这些信息能帮助你在开发中更好地使用定时任务,提升你的项目管理能力!如果你还有问题,欢迎继续询问。