在 Flask 应用中使用 Celery 来执行每月定时任务是一个常见的需求,特别是在需要定期执行后台任务(如数据清理、报告生成等)时。Celery 是一个强大的异步任务队列/作业队列,基于分布式消息传递。它支持多种消息代理,如 RabbitMQ、Redis 等。

以下是如何在 Flask 应用中设置 Celery 并配置每月定时任务的步骤:

1. 安装必要的库

首先,确保安装了 Flask、Celery 和一个消息代理(这里以 Redis 为例)。

pip install flask celery redis

2. 配置 Celery

在 Flask 应用中,需要配置 Celery 以连接到消息代理。

from celery import Celery
from flask import Flask

app = Flask(__name__)

# 配置 Celery
# 假设 Redis 服务器运行在本地,默认端口
celery = Celery(app.name, broker='redis://localhost:6379/0')

# 在这里配置 Celery 的其他选项
# celery.conf.update(
#     result_backend='redis://localhost:6379/0',
#     task_serializer='json',
#     accept_content=['json'],  # Ignore other content
#     result_serializer='json',
#     timezone='utc',
#     enable_utc=True,
# )

# 加载 Celery 配置(可选,如果将配置放在单独的文件中)
# celery.config_from_object('celeryconfig')

3. 编写定时任务

使用 Celery 的定时任务功能(Celery Beat),可以定义每月执行的任务。

from celery.schedules import crontab

@celery.task
def monthly_task():
    print("Executing monthly task...")
    # 这里添加任务逻辑

# 配置 Celery Beat 定时任务
celery.conf.beat_schedule = {
    'monthly-task': {
        'task': 'your_app_name.monthly_task',  # 注意替换为 app 名称和 task 名称
        'schedule': crontab(day_of_month=1, hour=0, minute=0),  # 每月第一天凌晨执行
    },
}

4. 启动 Celery Worker 和 Celery Beat

需要启动 Celery Worker 来处理任务,以及 Celery Beat 来调度任务。

启动 Celery Worker:

celery -A your_app_module worker --loglevel=info

替换 your_app_module 为Flask 应用模块名(通常是包含 Celery 实例定义的文件名,不包括 .py 后缀)。

启动 Celery Beat:

celery -A your_app_module beat --loglevel=info

5. 验证

确保的 Redis 服务正在运行,并且 Celery Worker 和 Celery Beat 也已启动。然后,等待到每月的第一天,查看任务是否按预期执行。

注意事项

  • 确保 Flask 应用和 Celery 使用的环境(如 Python 版本、库版本)保持一致。
  • 在生产环境中,可能需要配置更复杂的 Celery 和 Redis 设置,包括认证、持久化等。
  • 考虑到 Flask 应用的重启和部署,确保 Celery Worker 和 Celery Beat 能够在应用重启后继续运行。需要将它们作为服务或守护进程来运行。

flask celery python 每月定时任务_定时任务