fastapi: 用celery处理长耗时的任务

一,安装要用到的库

$ pip install celery redis

二,代码

image

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

 

启动任务

image

查看状态

image

完成

image

 

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