Приложение Python Flask застряло без ответа - PullRequest
0 голосов
/ 30 октября 2018

У меня есть приложение Flask, работающее на сервере Linux, и я заметил, что иногда оно зависает при отправке ему запроса POST, а затем переходит в GET и снова пытается POST (затем оно застревает). Если я сделаю GET снова, будет снято «зависание» (тогда будет завершен последний застрявший POST).

Первая часть приложения Flask:

@app.route('/myroute', methods=['GET','POST'])
def myfunction():
    if request.method == 'POST':
        ...
    else:
        ...

Начиная с:
FLASK_APP=myflask.py FLASK_DEBUG=1 python -m flask run --port 8300 --host=0.0.0.0 --no-reload.

Также установил параллельные потоки с:

if __name__ == '__main__':
    app.run(threaded=True)

но это не помешало застрять.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Сервер WSGI, поставляемый с Flask, рекомендуется только для целей разработки и не подходит для запросов с большой нагрузкой. Поскольку вы упомянули серверы Linux, рекомендуется использовать Gunicorn . Gunicorn быстр и легок в использовании ресурсов сервера. После установки с pip install gunicorn вы можете легко назначать рабочие потоки, поскольку ваше приложение продолжает получать более высокие запросы. В приведенном ниже примере назначаются 4 рабочих процесса (-w 4).

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

Дополнительную информацию о подобных автономных контейнерах WSGI вы можете найти в официальной документации Flask .

0 голосов
/ 30 октября 2018

Код внутри if __name__ == '__main__' не запускается при запуске приложения с помощью python -m flask run ....

Таким образом, threaded=True -часть не действует.

Используйте ключ командной строки --with-threads.

$ flask run --help
Usage: flask run [OPTIONS]

  Runs a local development server for the Flask application.

  This local server is recommended for development purposes only but it can
  also be used for simple intranet deployments.  By default it will not
  support any sort of concurrency at all to simplify debugging.  This can be
  changed with the --with-threads option which will enable basic
  multithreading.

  The reloader and debugger are by default enabled if the debug flag of
  Flask is enabled and disabled otherwise.

Options:
  -h, --host TEXT                 The interface to bind to.
  -p, --port INTEGER              The port to bind to.
  --reload / --no-reload          Enable or disable the reloader.  By default
                                  the reloader is active if debug is enabled.
  --debugger / --no-debugger      Enable or disable the debugger.  By default
                                  the debugger is active if debug is enabled.
  --eager-loading / --lazy-loader
                                  Enable or disable eager loading.  By default
                                  eager loading is enabled if the reloader is
                                  disabled.
  --with-threads / --without-threads
                                  Enable or disable multithreading.
  --help                          Show this message and exit.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...