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

时间:2018-09-12 09:24:02

标签: python flask gunicorn uwsgi

我遇到一个奇怪的问题。我有以下简单/示例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与同一烧瓶应用程序的另一个URL(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

1 个答案:

答案 0 :(得分:3)

当与金枪鱼一起运行时,似乎会产生死锁。与多个工作程序一起运行时,它似乎运行良好:

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

这显然不是真正的解决方案,因为多个并发请求仍然可能会产生死锁。我不知道为什么在没有枪杀角的情况下无法实现这一点。