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的异步改造让接口响应时间从秒级降到了毫秒级。核心经验是:同步只做必要操作,耗时操作全部异步化,用任务状态查询接口让用户感知进度。

目录
相关文章
|
1月前
|
人工智能 算法 测试技术
独家揭秘:拼多多测试团队如何用AI把回归时间从3天压到2小时
拼多多测试团队借AI重构回归流程:代码提交即启动智能分析,精准筛选高风险用例,将大促前回归从3天压缩至2小时内,告别通宵等待——瓶颈不在执行速度,而在决策智能。
|
1月前
|
弹性计算 小程序 关系型数据库
一次真实录屏:我只说每月别超过 200 块,小程序后端就搭好了
iac-code 通过自然语言交互,自动规划、创建并管理符合预算的小程序后端云资源。本文结合真实录屏,展示它如何准备多套方案、给出架构与费用、在创建前等待确认,并在 RDS 规格下线后自动处理、继续部署,大幅降低阿里云的使用门槛。
一次真实录屏:我只说每月别超过 200 块,小程序后端就搭好了
|
1月前
|
Web App开发 数据采集 iOS开发
Python爬虫的User-Agent轮换与浏览器指纹模拟实战
本文介绍日本代购爬虫的反爬策略:通过User-Agent池(随机/轮询/平台适配)、浏览器指纹模拟(多维度请求头)、随机化请求间隔及智能重试机制,构建高拟真度请求,有效绕过网站反爬检测,提升数据采集成功率。(239字)
245 1
|
1月前
|
存储 弹性计算 运维
阿里云国际站代理商:ECS宕机常见原因分析
阿里云 ECS 的宕机故障,大致可以归到三个方向:底层物理资源异常、实例内部软件与内核问题、以及外部网络攻击。每一类都有典型的日志特征和监控信号,但实际案例中,一个宕机事件往往是多因素叠加的结果,排查时切忌只看单一维度。
297 0
|
1月前
|
SQL 数据采集 缓存
Room 数据库迁移:让本地数据升级更稳
Room数据库迁移是Android本地数据升级的关键机制。通过定义Migration,安全处理表结构变更(如加字段、改名、拆表等),避免崩溃与数据丢失。需为非空字段设默认值,慎用破坏性迁移,并务必测试跨版本升级。迁移本质是守护用户历史数据的契约。
120 0
|
1月前
|
传感器 存储 数据采集
告别枯燥PPT:AR培训系统如何让新员工上手速度提升300%
在传统的企业培训体系中,新员工往往面临着“理论脱离实际”的困境。厚重的操作手册、冗长的PPT演示以及师傅带徒弟的口耳相传,不仅效率低下,且难以标准化。随着增强现实(Augmented Reality, AR)技术与云计算架构的深度融合,一种基于空间计算与实时数据交互的新型培训范式正在重塑企业的人才培养流程。本文将深入探讨基于云边端协同架构的AR培训系统的技术实现、核心功能模块及最佳实践,解析其如何通过沉浸式交互与数字化反馈,将新员工的上手速度提升数倍。
|
2月前
|
前端开发 数据可视化 JavaScript
跨境电商物流追踪系统设计:WebSocket实时推送与状态机管理
本方案为日本跨境电商设计物流追踪系统:基于Python状态机精准管理订单全生命周期(待支付→签收→完成),结合WebSocket实现实时状态推送,避免轮询开销;集成多快递运单解析与物流信息聚合,并提供前端动态UI更新示例,全面提升用户包裹可视化体验。(239字)
156 0
|
运维 监控 安全
VMware NSX 9.0 正式版发布 - 下一代网络安全虚拟化平台
VMware NSX 9.0 正式版发布 - 下一代网络安全虚拟化平台
833 3
VMware NSX 9.0 正式版发布 - 下一代网络安全虚拟化平台
|
监控 安全 网络安全
VMware Cloud Foundation Operations 9.0 新增功能
VMware Cloud Foundation Operations 9.0 新增功能
259 0
|
10月前
|
NoSQL IDE MongoDB
Studio 3T 2025.18 发布 - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.18 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
584 0
Studio 3T 2025.18 发布 - MongoDB 的终极 GUI、IDE 和 客户端