fastapi celery flower rabbitmq redis 可运行demo

资料

1.FastAPi Celery RabbitMQ 与 Redis 的使用,并使用 Flower 监控 Celery 状态 - 星尘的博客 - 博客园

2.Celery + Flower + FastAPI + RabbitMQ ,Python实现异步消息队列和监控_fastapi rabbitmq-优快云博客

3.FastAPI如何集成celery实现定时任务和异步任务并且使用docker-compose部署 - JentZhang - 博客园

4.window下celery正常启动后能收到任务但不执行任务的解决办法 - 乔小生1221 - 博客园

5.Celery周期任务正常启动后能收到任务,但不执行任务的解决办法_celery任务不执行-优快云博客

6.FastAPI项目中用Celery和RabbitMQ处理耗时任务,提升服务器响应速度-原创手记-慕课网

7.开发环境下,如何通过一个命令让 fastapi 和 celery 一起工作-腾讯云开发者社区-腾讯云

8.构建高性能异步任务引擎:FastAPI + Celery + Redis_celery fastapi-优快云博客

9.【问题记录】获取celery任务状态报错 - AttributeError: ‘DisabledBackend‘ object has no attribute ‘_get_task_meta_for-优快云博客

10.Celery产生随机队列问题_celery traceback-优快云博客

11.celery踩过的坑 | 不做大哥好多年

过程

        开发环境

        windows, 已经安装好的 rabbitmq

        目录结构

/project_root

├── /app
│   ├── __init__.py
│   ├── main.py
│   ├── tasks.py
│   ├── celery_config.py
│   └── worker.py

├── /logs(非必须)
├── /venv(非必须)
├── requirements.txt(非必须)
└── README.md(非必须)

依赖的三方库

amqp==5.3.1
annotated-types==0.7.0
anyio==4.8.0
billiard==4.2.1
celery==5.4.0
click==8.1.8
click-didyoumean==0.3.1
click-plugins==1.1.1
click-repl==0.3.0
colorama==0.4.6
dnspython==2.7.0
eventlet==0.39.1
fastapi==0.115.11
flower==2.0.1
greenlet==3.1.1
h11==0.14.0
humanize==4.12.1
idna==3.10
kombu==5.4.2
pip==25.0.1
prometheus_client==0.21.1
prompt_toolkit==3.0.50
pydantic==2.10.6
pydantic_core==2.27.2
python-dateutil==2.9.0.post0
pytz==2025.1
six==1.17.0
sniffio==1.3.1
starlette==0.46.1
tornado==6.4.2
typing_extensions==4.12.2
tzdata==2025.1
uvicorn==0.34.0
vine==5.1.0
wcwidth==0.2.13

        文件内容

celery_config.py

from celery import Celery

# 使用RabbitMQ作为消息中间件
celery_app = Celery('tasks', broker="amqp://《username》:《password》@《hostname》:《port》//")

# 配置Celery
celery_app.conf.update(
    imports=["app.tasks"],
    result_backend='rpc://',  # 使用RPC作为结果后端
    task_serializer='json',   # 任务数据使用json格式
)

 main.py

from fastapi import FastAPI
from .tasks import add

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello World"}

@app.post("/add_task/")
def create_task(a: int, b: int):
    task = add.delay(a, b)  # 调用Celery任务
    return {"task_id": task.id}

 tasks.py

from celery import Celery

# 引入 Celery 配置
from .celery_config import celery_app

# 定义一个简单的任务
@celery_app.task
def add(a, b):
    return a + b

worker.py 

from .celery_config import celery_app

if __name__ == "__main__":
    celery_app.start()

         运行

fastapi

uvicorn main:app --host 0.0.0.0 --port 9000

celery

celery -A app.worker worker -l info  -P solo -c 2

 flower

celery -A app.worker flower

        测试

打开网址

点点就可以了

踩坑

        无法运行 celery 命令

        在写 demo 的 时候  为了便捷运行 , 笔者 将 fastapi,celery,flower 的运行 命令写在了三个 脚本文件里面 celery.cmd , runfastapi.bat , flower.cmd 运行时只有 runfastapi.bat 正确运行,其他两个脚本在控制台 无限重复运行,手动在控制台输入命令即可。【应该是与文件名有关  -_-!】

        运行 celery 后电脑卡顿

        与celery的命令参数有关 添加 -c 2 就好了。

        无法运行 worker.py 

        不能直接运行 worker.py 文件,这个需要配合 celery 来运行滴

        创建了许多 随机队列

        查看这些随机队列,会自动删除,周期是 24h

Features
x-expires:86400000
auto-delete:true
### 如何在 FastAPI使用 CeleryRedis 为了实现 FastAPI 项目中集成 CeleryRedis 的需求,以下是详细的说明: #### 1. 安装依赖项 首先需要安装 `fastapi`、`uvicorn`、`celery` 和 `redis-py` 库。可以通过以下命令完成安装: ```bash pip install fastapi uvicorn celery redis ``` #### 2. 配置 Celery 实例 创建一个文件名为 `celery_app.py` 的模块来定义 Celery 实例并配置其连接到 Redis。 ```python from celery import Celery # 使用 Redis 作为消息代理和结果存储后端 CELERY_BROKER_URL = 'redis://localhost:6379/0' CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 创建 Celery 实例 celery_app = Celery('worker', broker=CELERY_BROKER_URL, backend=CELERY_RESULT_BACKEND) # 可选:加载默认配置 celery_app.conf.update( task_serializer='json', accept_content=['json'], result_serializer='json', timezone='UTC', enable_utc=True, ) ``` 此部分代码通过指定 Redis URL 来初始化 Celery 并设置序列化器和其他选项[^2]。 #### 3. 定义异步任务 在单独的任务模块(如 `tasks.py`)中定义具体的 Celery 任务逻辑。 ```python from celery_app import celery_app @celery_app.task def add(x, y): return x + y ``` 这里展示了如何基于已有的 Celery 实例注册一个新的任务函数 `add()`,它接受两个参数并将它们相加返回结果[^1]。 #### 4. 启动 Celery Worker 运行下面的命令启动 Celery worker 进程监听来自队列的新任务请求。 ```bash celery -A celery_app.celery_app worker --loglevel=info ``` 这一步非常重要,因为它负责实际执行由 API 调度过来的工作单元[^2]。 #### 5. 整合至 FastAPI 应用程序 最后,在主应用程序入口处调用这些后台作业服务。例如修改如下所示的一个简单 RESTful 接口用于触发远程计算操作: ```python from fastapi import FastAPI import tasks app = FastAPI() @app.post("/compute/") async def compute(): # 发送任务给 Celery 处理 future_result = tasks.add.delay(4, 8) return {"task_id": str(future_result), "status":"Processing"} ``` 当客户端向 `/compute/` POST 请求时,服务器会立即将该工作委派出去而不等待最终答案立即响应成功状态码以及唯一标识符以便稍后查询进度或获取成果[^2]。 --- ### 注意事项 - **环境变量管理**: 如果不想硬编码敏感数据比如密码之类的建议采用 `.env` 文件配合 python-dotenv 扩展包读取外部配置替代固定字符串形式写死进去的做法更加安全灵活可控性强一些. - **错误处理机制设计合理完善**, 对可能出现的各种异常情况要有预见性和针对性解决方案以免影响用户体验甚至造成系统崩溃等问题发生.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值