扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

  1. Celery基础概念

    Celery架构由三部分组成:客户端(发送任务)、消息代理(存储任务队列)、工作者(执行任务)。典型的消息代理选择包括Redis(支持6379端口)和RabbitMQ(默认使用5672端口)。任务结果存储建议使用Redis或关系型数据库,需在配置中明确指定backend参数。

  2. FastAPI与Celery集成步骤

graph TD;
A(用户请求) --> B(FastAPI路由);
B --> C(任务入队);
C --> D(消息队列);
D --> E(Celery Worker处理);
E --> F(结果存储);
F --> G(客户端查询);
  1. 代码实现与解析

    安装依赖:
pip install fastapi==0.103.2 celery==5.3.4 redis==4.5.5 uvicorn==0.23.2 pydantic==2.5.2

项目结构:

project/
├── main.py
├── celery_app.py
└── tasks.py

核心代码示例:

# celery_app.py
from celery import Celery celery_app = Celery(
'worker',
broker='redis://localhost:6379/0',
backend='redis://localhost:6379/1',
include=['project.tasks']
)
celery_app.conf.update(task_track_started=True) # tasks.py
from .celery_app import celery_app @celery_app.task
def process_data(data: dict) -> dict:
"""模拟耗时数据处理任务"""
import time
time.sleep(5)
return {"result": f"Processed {data['input']}"} # main.py
from fastapi import FastAPI
from pydantic import BaseModel
from .tasks import process_data app = FastAPI() class RequestData(BaseModel):
input: str
priority: int = 1 @app.post("/submit-task")
async def submit_task(data: RequestData):
"""提交异步任务接口"""
task = process_data.apply_async(
kwargs={"data": data.dict()},
priority=data.priority
)
return {"task_id": task.id}
  1. 任务状态查询实现
@app.get("/task-status/{task_id}")
async def get_task_status(task_id: str):
"""任务状态查询接口"""
from celery.result import AsyncResult
result = AsyncResult(task_id, app=celery_app)
return {
"status": result.status,
"result": result.result if result.ready() else None
}
  1. 课后Quiz

    Q1:为什么需要为Celery配置不同的Redis数据库作为broker和backend?

    A1:区分存储空间,避免任务队列与结果数据相互干扰。broker的0号库存储待处理任务,backend的1号库保存任务状态和结果。

Q2:如何处理长时间运行的任务超时问题?

A2:在任务装饰器中设置soft_time_limit参数,例如@task(soft_time_limit=300),同时配置worker的--maxtasksperchild参数限制最大任务数。

  1. 常见报错解决方案

    错误现象:Worker收到任务但未执行

    检查要点:
  2. 确认Redis服务运行状态:redis-cli ping应返回PONG
  3. 检查任务模块是否包含在配置中:celery_app的include参数需正确指向tasks模块
  4. 验证任务函数是否正确定义:使用@celery_app.task装饰器

错误现象:任务结果无法获取

解决方案:

  1. 检查backend配置是否正确

  2. 确认任务执行完成(状态为SUCCESS)

  3. 检查Redis存储空间是否充足

  4. 任务优先级配置

    在启动worker时指定队列:

celery -A project.celery_app worker -Q high_priority,default -l INFO

接口调用时指定优先级:

process_data.apply_async(
kwargs={"data": data},
queue='high_priority' if data.priority > 5 else 'default'
)

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:如何让FastAPI与Celery完美联姻,打造高效异步任务处理系统?

往期文章归档:

免费好用的热门在线工具

如何让FastAPI与Celery完美联姻,打造高效异步任务处理系统?的更多相关文章

  1. Celery—分布式的异步任务处理系统

    Celery 1.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组 ...

  2. 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...

  3. 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装

    WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...

  4. 打造高效前端工作环境 - tmux

    打造高效前端工作环境 - tmux 前言  现在前端开发可不容易啊,先打开个VIM,然后再打开个lite-server,一不小心写个ES2015还要打开个gulp来做预编译,如果能把这么多个窗口放在一 ...

  5. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  6. 使用jQuery,实现完美的表单异步提交

    jQuery异步提交表单 <form id="form1" method="post"> <table border="1" ...

  7. NNVM打造模块化深度学习系统(转)

    [摘录理由]: 之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm):读者能够直接体会文中所述的意义,便于立刻展开研究. MXNet专栏 :NNVM ...

  8. 在tornado中使用celery实现异步任务处理之中的一个

    一.简单介绍 tornado-celery是用于Tornado web框架的非堵塞 celeryclient. 通过tornado-celery能够将耗时任务增加到任务队列中处理, 在celery中创 ...

  9. AngularJs打造一个简易权限系统

    AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...

  10. Linux下打造全方位立体监控系统

    前言 本文主要介绍如何使用Grafana和Prometheus以及node_exporter对Linux服务器性能进行监控.下面两张图分别是两台服务器: 服务器A 服务器B 概述 Prometheus ...

随机推荐

  1. python获取指定文件夹内文件名称

    比如下图,文件夹内有若干文件,且文件夹路径:C:\Users\Administrator\Desktop\2147\1024 4行代码,解决问题 import os path = "C:\\ ...

  2. 关于全球化大规模混合云 Kubernetes Prometheus 监控体系标准化及 GitOps 自动化改进方案

    背景 现状 某司概况: PaaS/SaaS 公司,业务面向全球,包括 东南亚/南亚/中东/欧洲/非洲/美洲/东亚... 生产 k8s 集群数十套,生产非生产 >100 套(多种集群类型,各种公有 ...

  3. 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

    如何使用 MySQL 的 EXPLAIN 语句进行查询分析? EXPLAIN 是 MySQL 提供的分析 SQL 查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能. 1. EXPLAI ...

  4. CTFHub技能树RCE命令注入

    1.命令注入 // 关键代码 <?php $res = FALSE; if (isset($_GET['ip']) && $_GET['ip']) {// 传入ip, $cmd ...

  5. [数据库/SQL] 浅谈DDL、DSL、DCL、DML、DQL

    概念辨析:SQL.DQL.DML.DDL.DCL SQL(Structure Query Language, 结构化查询语言)语言是数据库的核心语言. SQL的发展是从1974年开始的,其发展过程如下 ...

  6. Dynamic adaptation to application sizes (DATAS) GC 策略

    现在大家的 .NET 程序基本都部署在如 K8S 这种容器化场景下.出于节约资源的考虑,往往我们还会限制每个实例占用的资源.不知道大家发现没有,在一些高并发的场景下,我们的程序会占用非常多的内存,内存 ...

  7. Spring Kafka: UnknownHostException: 34bcfcc207e0

    参考: https://stackoverflow.com/questions/69527813/spring-kafka-unknownhostexception-34bcfcc207e0 我遇到的 ...

  8. NB!一款基于java开发的漏洞检测工具,集合了泛微、用友、大华、海康、致远、红帆、万户、帆软等漏洞

    1.工具介绍 基于 https://github.com/yhy0/ExpDemo-JavaFX 上添加poc 2.工具下载链接: 工具下载:工具下载 3.新增检测漏洞 用友NC-Cloud系统接口g ...

  9. 【BUG】nuget restore遇到的两个报错“Failed to load msbuild Toolset”和“当前 .NET SDK 不支持将 .NET 6.0 设置为目标”

    出错环境: Visual Studio 2019 1. Failed to load msbuild Toolset 解决:https://github.com/NuGet/Home/issues/4 ...

  10. 制作带sshd功能的centos镜像

    docker run -it --name node1 docker.io/centos bash  创建node1容器 docker exec -it node1 bash 进入node1 yum ...