fastapi: 用celery处理长耗时的任务
一,安装要用到的库
$ pip install celery redis
二,代码

celery_app
from celery import Celery
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.conf.update(
task_serializer="json",
result_serializer="json",
accept_content=["json"],
timezone="Asia/Shanghai",
enable_utc=True,
task_track_started=True, # 开启此项后,任务开始执行时状态会变为 STARTED
result_expires=86400, # (状态保留 24 小时后自动删除)
)
app/tasks/my_tasks.py
# app/tasks/my_tasks.py
import time
from celery_app import celery_app
# 使用 shared_task 或直接使用初始化好的 celery_app 注册任务
@celery_app.task(bind=True, name="app.tasks.my_tasks.long_running_task")
def long_running_task(self, total_steps: int):
print("🚀 后台长耗时任务开始...")
for i in range(total_steps):
time.sleep(1)
progress = int((i + 1) / total_steps * 100)
# 更新中间状态
self.update_state(
state="PROGRESS",
meta={"current": i + 1, "total": total_steps, "percent": progress}
)
print("✅ 后台长耗时任务结束!")
return {"status": "success", "processed_steps": total_steps}
三,测试效果:
启动web应用:
$ uvicorn main:app --reload
启动celery:
$ celery -A celery_app.celery_app worker --loglevel=info --concurrency=4
启动任务

查看状态

完成

浙公网安备 33010602011771号