fastapi: 用celery处理定时任务

一,安装第三方库

$ pip install celery redis

二,代码:

# app/tasks/my_cron.py

# app/tasks/my_cron.py
import datetime

from celery_app import celery_app
from app.core.logger import logger

# 注册一个定时清理或检查的任务
@celery_app.task(name="app.tasks.my_cron.clear_expired_sessions")
def clear_expired_sessions():
    """
    模拟每天凌晨执行的清理过期 Session 的任务
    """
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    content = f"⏰ [定时任务触发] 当前时间: {now} | 开始清理过期数据库 Session..."
    print(content)

    logger.bind(log_type="alipay").info(content)

    # 你的数据库清理逻辑写在这里
    return "Cleanup completed"

@celery_app.task(name="app.tasks.my_cron.generate_system_report")
def generate_system_report(report_type: str):
    """
    模拟带参数的定时报表生成任务
    """
    content = f"📊 [定时任务触发] 正在生成每周的 {report_type} 报表..."
    print(content)
    logger.bind(log_type="alipay").info(content)
    return "Report generated"

celery_app.py

from celery import Celery
from celery.schedules import crontab
from datetime import timedelta


celery_app = Celery(
    "worker",
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/1"
)

# 🚀 关键:生产环境必须显式指定包含任务的模块,否则 Celery Worker 启动时找不到任务
celery_app.autodiscover_tasks(["app.tasks.my_tasks"], force=True)
# 确保能自动发现任务
celery_app.autodiscover_tasks(["app.tasks.my_cron"], force=True)

# 优化生产配置
celery_app.conf.update(
    task_serializer="json",
    result_serializer="json",
    accept_content=["json"],
    timezone="Asia/Shanghai",
    enable_utc=False,     # 关闭 UTC 强制转换
    task_track_started=True, # 开启此项后,任务开始执行时状态会变为 STARTED
    result_expires=86400, # (状态保留 24 小时后自动删除)
)

# 📅 核心配置:定义类似 Linux Crontab 的定时任务表
celery_app.conf.beat_schedule = {
    # 任务 1:每分钟的第 0 秒执行一次(用于测试效果)
    "clear_sessions_every_minute": {
        "task": "app.tasks.my_cron.clear_expired_sessions",  # 必须和任务定义中的 name 一致
        "schedule": crontab(minute="*"),  # 相当于 Linux 的 * * * * *
    },
    # 任务 4:每5分钟执行一次
    "five_minute_cron": {
        "task": "app.tasks.my_cron.generate_system_report",
        "schedule": timedelta(minutes=5),  # 相当于 */5 * * * *
        "kwargs": {"report_type": "System_Performance"},
    },

}

 

三,运行并测试效果:

启动worker进程:

$ celery -A celery_app.celery_app worker --loglevel=info --concurrency=4

启动beat进程:

celery -A celery_app.celery_app beat --loglevel=info

 查看代码中生成的日志:

2026-06-18 14:47:03 | ⏰ [定时任务触发] 当前时间: 2026-06-18 14:47:03 | 开始清理过期数据库 Session...
2026-06-18 14:48:07 | ⏰ [定时任务触发] 当前时间: 2026-06-18 14:48:07 | 开始清理过期数据库 Session...
2026-06-18 14:49:07 | ⏰ [定时任务触发] 当前时间: 2026-06-18 14:49:07 | 开始清理过期数据库 Session...
2026-06-18 14:50:03 | ⏰ [定时任务触发] 当前时间: 2026-06-18 14:50:03 | 开始清理过期数据库 Session...
2026-06-18 14:51:07 | ⏰ [定时任务触发] 当前时间: 2026-06-18 14:51:07 | 开始清理过期数据库 Session...
2026-06-18 14:51:12 | 📊 [定时任务触发] 正在生成每周的 System_Performance 报表...

 

posted @ 2026-06-21 13:08  刘宏缔的架构森林  阅读(3)  评论(0)    收藏  举报