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

Flask应用部署Gunicorn后使用requests调用本地接口超时问题

问题原因与解决方案

问题根源

你遇到的超时是Gunicorn同步Worker的死锁问题,具体逻辑如下:

  • Gunicorn默认使用sync(同步)Worker模式,且默认只启动1个Worker进程。
  • 当请求/路由时,唯一的Worker进程会执行index()函数,其中的requests.get(API_URL + "/test")会向本地/test路由发起请求。
  • 此时Worker进程正被/的请求占用,处于阻塞等待状态,完全无法处理新的/test请求。
  • 这种互相等待的死锁会持续到Gunicorn触发默认30秒的Worker超时,超时后Gunicorn会杀死当前Worker并重启,积压的/test请求才会被新Worker处理。

解决办法

1. 增加Worker进程数

启动Gunicorn时指定多个Worker,让不同的Worker处理不同请求:

gunicorn -w 2 "app.main:create_app()"

这样一个Worker处理/请求时,另一个Worker可以响应/test请求,避免死锁。

2. 使用异步Worker

改用异步Worker类型(如gevent),异步Worker在等待HTTP响应时可以切换处理其他请求,不会阻塞:

  1. 先安装依赖:
pip install gevent
  1. 启动命令改为:
gunicorn -k gevent "app.main:create_app()"

3. 直接内部调用函数(最优方案)

完全避免内部HTTP调用,直接在代码里调用目标函数:

@app.route('/')
def index():
    return test()  # 直接调用test函数,无需发起HTTP请求

这种方式性能最高,也从根源上避免了死锁问题。

内容的提问来源于stack exchange,提问作者Kai McClennen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:32:17