python - Gunicorn 不允许在同一个服务器实例上请求 url
问题描述
我遇到了一个奇怪的问题。我有以下简单/示例 Flask 应用程序:
# from __future__ import print_function
import requests
from flask import Flask
PORT = 6556
app = Flask(__name__)
@app.route('/')
def index():
j = {'data': 1}
print('INDEX CALLING API')
response = requests.post('http://localhost:{}/fake_api'.format(PORT), json=j)
print('INDEX CALLED API')
return response.text
@app.route('/fake_api', methods=['POST'])
def fake_api():
print('FAKE_API CALL RECEIVED')
return 'Ok, it works'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=PORT, debug=True)
基本上,我正在模拟的是调用一个 url ( ) 并使用同一个烧瓶应用程序 () 的另一个 url 进行http://localhost:6556/
路由调用。相当平庸,如果我只是用.requests
http://localhost:6556/fake_api
python server.py
问题是当我尝试像这样使用 gunicorn 运行服务器时
gunicorn -b 0.0.0.0:6556 server:app
应用程序在请求上无限期挂起。实际上它打印'INDEX CALLING API'
然后停止。
我在使用 uWSGI 时遇到了同样的问题。任何的想法?
编辑
我接受了 ikkuh 的回答,因为这个问题似乎与通过产生多个进程可以解决的死锁有关。但是,对我有用的是安装和设置gevent
为工人经理,因为默认设置是sync
:
# pip install gevent
gunicorn -b 0.0.0.0:6556 -k gevent server:app
解决方案
使用 gunicorn 运行时似乎会产生死锁。当与多个工人一起运行时,它似乎运行良好,如下所示:
gunicorn -b 0.0.0.0:6556 --workers=2 server_test:app
这显然不是真正的解决方案,因为多个并发请求仍然可能造成死锁。我不知道为什么在没有 gunicorn 的情况下运行时不会发生这种情况。
推荐阅读
- javascript - 当我尝试调用对象的属性时获取未定义的值
- r - 如何在R中使用2个数据框进行多重连接
- javascript - 如何在 React Form 中实现条件逻辑
- excel - 根据部分文件名将文件移动到各自的文件夹
- regex - 在 Azure Kubernetes 日志中使用正则表达式解析容器 insites
- javascript - Javascript下拉列表没有选项
- flutter - 我正在使用物联网开发 Flutter。无法连接到具有 wifi 的设备并将凭据发送到设备
- azure - CosmosDB gremlin 图:按顶点对顶点和边进行分组
- .net - conhost.exe 似乎在泄漏内存
- android - 离子电容器不会在 App Close 上关闭 cookie