Gunicorn значительно замедляет выполнение колб с Vue Reference - PullRequest
0 голосов
/ 15 мая 2018

Я использую Gunicorn для запуска очень простого приложения Flask (через pipenv), на которое ссылается веб-сайт Vue (настолько простой, что он не намного сложнее, чем этот MCVE).


Pipfile :

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[dev-packages]

[packages]
flask = "*"
flask-cors = "*"
flask-pymongo = "*"
gunicorn = "*"

[requires]
python_version = "3.5"

wsgi.py :

from helloworld import application

if __name__ == "__main__":
    application.run()

helloworld.py :

from flask import Flask
from flask_cors import CORS
from flask_pymongo import PyMongo

import json

application = Flask(__name__)
CORS(application)

application.config['MONGO_DBNAME'] = 'helloworld'
mongo = PyMongo(application, config_prefix='MONGO')

@application.route("/greet")
def hello():
    someone = mongo.db.people.find_one({},{"_id":0})
    return json.dumps(someone)

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=5432)

index.html :

<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello</h1>
    <p class="paragraph" id="app">{{ greeted }}!</p>
  </body>
</html>
<script>
  new Vue({
    el: '#app',
    data: {
      greeted: ''
    },
    created () {
      fetch('http://0.0.0.0:5432/greet')
        .then(response => response.json())
        .then(json => {this.greeted = json.name})
    }
  })
</script>

(вызов mongo.db.people.find_one({},{"_id":0}) возвращает {"name":"World"})


Когда я запускаю это с помощью Flaskсервер разработки:

pipenv run python helloworld.py

Сайт быстро получает значение при жестком обновлении.Однако, если я запустил это через Gunicorn:

pipenv run gunicorn -w 3 -b 0.0.0.0:5432 wsgi

Для возврата данных может потребоваться несколько секунд (иногда порядка минут).

Что вызывает такое поведение?

Для справки: этот вопрос похож по названию, но имел другую проблему.

РЕДАКТИРОВАТЬ : Если я позволю серверу работать достаточно долго, я получаю следующие сообщения:

[CRITICAL] WORKER TIMEOUT (pid:XXXXX)

EDIT 2 : Изменение типа работника на gevent, похоже, решает проблему:

pipenv run gunicorn --worker-class gevent -w 3 -b 0.0.0.0:5432 wsgi

Я не уверен, почему (я не делаю ничего, что должно привести к блокировке на десятки секунд).Кроме того, переход на gevent приводит к этому предупреждению:

/ home / user / .local / share / virtualenvs / FlaskApp-XXXXX / lib / python3.5 / site-packages / gunicorn / worker / ggevent.py: 65: MonkeyPatchWarning: Monkey-patching ssl после того, как ssl уже был импортирован, может привести к ошибкам, включая RecursionError на Python 3.6.Пожалуйста, обезьяна-патч раньше.См. https://github.com/gevent/gevent/issues/1016 monkey.patch_all (подпроцесс = True)

...