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 报表...
浙公网安备 33010602011771号