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响应时可以切换处理其他请求,不会阻塞:
- 先安装依赖:
pip install gevent
- 启动命令改为:
gunicorn -k gevent "app.main:create_app()"
3. 直接内部调用函数(最优方案)
完全避免内部HTTP调用,直接在代码里调用目标函数:
@app.route('/') def index(): return test() # 直接调用test函数,无需发起HTTP请求
这种方式性能最高,也从根源上避免了死锁问题。
内容的提问来源于stack exchange,提问作者Kai McClennen
相关产品推荐
相关产品推荐

