Gunicorn不允许在同一服务器实例上请求URL

问题描述 投票:0回答:1

我遇到了一个奇怪的问题。我有以下简单/示例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(http://localhost:6556/)并使用requests调用相同烧瓶app(http://localhost:6556/fake_api)的另一个url。如果我只是用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
python flask gunicorn uwsgi
1个回答
3
投票

看起来它在用gunicorn运行时会造成僵局。当运行多个worker时,它似乎运行良好,如下所示:

gunicorn -b 0.0.0.0:6556 --workers=2 server_test:app

这显然不是真正的解决方案,因为多个并发请求仍然可能会造成死锁。我不知道为什么在没有枪支的情况下没有发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.