Python Flask API多请求性能测试及异步改造后远程连接超时问题
问题分析与解决方案
核心问题定位
同步Flask API可正常通过公网访问,改造为异步后仅服务器本地能访问,公网请求超时,本质是异步Flask的部署方式、网络配置或代码阻塞点导致请求无法正常处理。
1. 更换为ASGI兼容的运行服务器
Flask自带的开发服务器(flask run)仅支持WSGI协议,对异步代码的并发处理能力为0——哪怕升级了Flask版本启用异步装饰器,用它部署线上服务会导致请求阻塞排队,最终触发超时。
- 必须使用支持ASGI的服务器,比如
uvicorn或hypercorn:- 安装依赖:
pip install uvicorn - 启动命令:
uvicorn your_app_module:app --host 0.0.0.0 --port 5010 --workers 4
(--workers建议根据服务器CPU核心数设置,通常为2*核心数+1)
- 安装依赖:
2. 检查网络与防火墙配置
哪怕代码绑定了0.0.0.0,以下环节仍可能导致公网无法访问:
- 云服务器安全组:确认是否开放了5010端口的入站流量(同步时正常的话,可能是改造后端口被误改,或安全组规则被重置)
- 本地防火墙:执行
firewall-cmd --list-ports(CentOS)或ufw status(Ubuntu),检查5010端口是否被允许 - 监听地址验证:执行
netstat -tulpn | grep 5010,确认服务器真的在监听0.0.0.0:5010,而非仅127.0.0.1
3. 排查异步代码中的阻塞点
异步代码如果混入同步阻塞操作,会直接卡住事件循环,导致所有请求无响应:
- 替换同步IO库:比如把
requests.get()换成异步HTTP库aiohttp - 强制异步执行同步代码:如果必须使用同步函数,用线程池包装:
import asyncio from flask import Flask app = Flask(__name__) def sync_blocking_task(): # 你的同步阻塞代码 pass @app.get("/async-endpoint") async def async_endpoint(): loop = asyncio.get_event_loop() result = await loop.run_in_executor(None, sync_blocking_task) return {"result": result} - 检查是否遗漏
await:所有异步函数调用必须加await,否则协程不会执行,请求会一直挂起
4. 性能测试相关优化
之前JMeter批量请求无响应、单请求正常,说明同步部署的并发能力不足,异步改造后需优化服务器配置:
- 调整ASGI服务器的性能参数:比如uvicorn可添加
--loop uvloop --http httptools启用更高效的事件循环和HTTP工具 - 避免在异步代码中做CPU密集型操作:这类操作会阻塞事件循环,建议放到单独的进程池处理
内容的提问来源于stack exchange,提问作者gsk_fs
相关产品推荐
相关产品推荐

