You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask API多请求性能测试及异步改造后远程连接超时问题

问题分析与解决方案

核心问题定位

同步Flask API可正常通过公网访问,改造为异步后仅服务器本地能访问,公网请求超时,本质是异步Flask的部署方式、网络配置或代码阻塞点导致请求无法正常处理。


1. 更换为ASGI兼容的运行服务器

Flask自带的开发服务器(flask run)仅支持WSGI协议,对异步代码的并发处理能力为0——哪怕升级了Flask版本启用异步装饰器,用它部署线上服务会导致请求阻塞排队,最终触发超时。

  • 必须使用支持ASGI的服务器,比如uvicorn或hypercorn:
    1. 安装依赖:pip install uvicorn
    2. 启动命令: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:15:10