Flask + Celery实现异步任务处理:从同步阻塞到异步非阻塞的改造实战

简介: 本文介绍如何用Celery+Redis对Flask跨境电商接口进行异步优化:将邮件发送、物流API调用、PDF生成等耗时操作解耦为后台任务,接口响应从1850ms降至100ms内;并涵盖任务状态查询、自动重试、定时调度及监控告警等完整实践。

一、业务场景
在跨境电商的Web应用中,有些操作很耗时——发送邮件、生成报表、调用第三方API。如果在请求处理中同步执行这些操作,用户需要等待很长时间。
我最早用Flask写接口时,所有操作都是同步的:
python
@app.route('/api/order', methods=['POST'])def create_order(): # 1. 保存订单(50ms) order = save_order(request.json) # 2. 发送确认邮件(500ms) send_email(order.email, order.id) # 3. 调用第三方物流API(1000ms) call_shipping_api(order) # 4. 生成PDF回执(300ms) generate_pdf(order) return {'order_id': order.id}
总耗时1850ms,用户体验很差。
二、Celery + Redis的异步改造
python
from celery import Celeryimport time# 初始化Celeryapp = Celery( 'tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')@app.taskdef send_email_async(email, order_id): """异步发送邮件""" time.sleep(0.5) # 模拟发送邮件 print(f"邮件已发送到{email},订单号{order_id}") return True@app.taskdef call_shipping_api_async(order_data): """异步调用物流API""" time.sleep(1.0) print(f"物流API调用成功,订单{order_data['id']}") return {'tracking_no': 'TRACK123'}@app.taskdef generate_pdf_async(order_id): """异步生成PDF""" time.sleep(0.3) print(f"PDF已生成,订单{order_id}") return f"/pdfs/{order_id}.pdf"
改造后的接口:
python
@app.route('/api/order', methods=['POST'])def create_order(): # 只有保存订单是同步的 order = save_order(request.json) # 其他操作全部异步 send_email_async.delay(order.email, order.id) call_shipping_api_async.delay(order.to_dict()) generate_pdf_async.delay(order.id) # 立即返回,总耗时<100ms return {'order_id': order.id, 'status': 'processing'}
三、任务状态查询
用户需要知道异步任务的状态:
python
from celery.result import AsyncResult@app.route('/api/order/status/')def get_order_status(order_id): # 从数据库获取订单状态 order = get_order(order_id) return { 'order_id': order_id, 'status': order.status, 'email_sent': order.email_sent, 'shipping_ready': order.shipping_ready, 'pdf_url': order.pdf_url }
四、任务重试与错误处理
python
@app.task(bind=True, max_retries=3, default_retry_delay=60)def call_shipping_api_with_retry(self, order_data): try: response = requests.post( 'https://shipping-api.example.com/create', json=order_data, timeout=5 ) if response.status_code != 200: raise Exception(f"API返回{response.status_code}") return response.json() except Exception as e: # 重试 self.retry(exc=e)
五、定时任务
Celery还支持定时任务(Beat):
python
from celery.schedules import crontabapp.conf.beat_schedule = { 'check_pending_orders': { 'task': 'tasks.check_pending_orders', 'schedule': crontab(minute='*/5'), # 每5分钟执行 }, 'sync_inventory_daily': { 'task': 'tasks.sync_inventory', 'schedule': crontab(hour=2, minute=0), # 每天凌晨2点 }}@app.taskdef check_pending_orders(): """检查未支付订单,超时自动取消""" pending = get_pending_orders(timeout=30) # 30分钟未支付 for order in pending: cancel_order(order.id) send_cancel_notification(order.user_id)
六、监控与告警
python
from celery.events import EventReceiverdef monitor_celery_tasks(): """监控Celery任务""" with app.connection() as connection: recv = EventReceiver(connection, handlers={ 'task-failed': handle_task_failed, 'task-succeeded': handle_task_succeeded, }) recv.capture(limit=None, timeout=None)def handle_task_failed(event): """任务失败时发送告警""" print(f"任务失败: {event['uuid']}, 错误: {event['exception']}") # 发送告警到钉钉 send_alert(f"Celery任务失败: {event['name']}")
七、总结
Flask + Celery的异步改造让接口响应时间从秒级降到了毫秒级。核心经验是:同步只做必要操作,耗时操作全部异步化,用任务状态查询接口让用户感知进度。

目录
相关文章
|
5天前
|
人工智能 弹性计算 运维
|
3天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
2天前
|
SQL 人工智能 自然语言处理
大模型内容安全实时防护:恶意Prompt注入拦截、越权阻断与熔断机制方案.166
本文系统阐述大模型输入安全防护体系,涵盖提示词注入、恶意Prompt拦截、越权阻断与输入熔断四大核心风险及应对方案。提出四层防护架构(预处理、检测、鉴权、熔断),结合规则引擎、语义识别与RBAC权限控制,实现全链路实时防护,保障业务合规、数据安全与服务稳定。
215 1
|
26天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
10天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
11天前
|
人工智能 缓存 安全
Claude Code 封号真实原因曝光,这次彻底不装了,直接针对国内开发者的账号下手?
Claude Code 封号潮背后:逆向扒出客户端隐写区域标记,Anthropic 政策收紧叠加 DeepSeek 7 月涨价,国产替代更紧迫。
|
20天前
|
存储 人工智能 监控
QoderWork完全指南:从入门到精通,把“AI实习生”变成你的全能工作搭档
阿里云2026年推出的桌面端AI工作助手QoderWork,不止聊天,更可动手干活:本地运行、安全可控,支持文件整理、数据分析、PPT生成、网页开发等;内置专家套件、多Agent协作与自定义Skills,让AI真正成为你身边的“AI实习生”。
|
17天前
|
人工智能 JSON 自然语言处理
让教学更智慧:用阿里云百炼工作流,自动生成中小学教材内容#小有可为#有温度的AI
通过可视化工作流编排,将大模型推理能力转化为标准化的教学内容生成引擎。教师只需输入教材标题和适用学段,即可自动获得结构完整、符合课程标准的章节内容,大幅降低备课门槛,助力教育资源均衡化。
510 127
|
3天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
239 0