Как я могу использовать WSGI для своего приложения Flask?Мое приложение использует поток - PullRequest
0 голосов
/ 18 мая 2018

У меня есть программа на Python.Он создает новый поток, который является сервером API.Работает в тестовой среде.Однако я хочу использовать WSGI (например, gunicorn) в производственной среде.Как я могу сделать это без серьезных изменений?

Есть много причин, по которым я хочу использовать WSGI, но одна большая причина в том, что я хочу установить тайм-аут, чтобы убивать открытые соединения для очень медленных запросов.Я столкнулся с проблемой производительности.Очень медленный запрос в конечном итоге влияет на другие запросы.

* файлы

├── server.py
└── api.py

* server.py

import time
import api

api_server = api.APIServer()
api_server.daemon = True
api_server.start()

while True:
  time.sleep(1)

* api.py

import threading
from flask import Flask

class APIServer(threading.Thread):

  def __init__(self):
    threading.Thread.__init__(self)

  def run(self):
    app = Flask(__name__)

    @app.route('/')
    def index():
      return 'hello'

    app.run(host="127.0.0.1", port=5000, threaded=True)

Обновление 1

Настоящий код здесь.Я взял некоторые из этого кода.

https://github.com/CounterpartyXCP/counterparty-lib/blob/master/counterpartylib/server.py#L403

Способ Vidstige является абсолютно правильным.Но я не хочу сильно меняться, если это возможно.

1 Ответ

0 голосов
/ 18 мая 2018

Самое сложное для вас - убедиться, что вы выполняете другую нить без проблем.Я предлагаю сделать это в два шага

  1. Измените потоки вокруг так, чтобы другие вещи запускались в фоновом потоке.
  2. Затем переключитесь на gunicorn, вы можете запустить фоновый поток, используяpost_worker_init Перехват сервера.

Ваша тема здесь не нужна.Вы можете сразу же переключиться на gunicorn.Просто установите pip install gunicorn и переместите приложение, например, на server.py.Это очень важно.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
  return 'hello'

Теперь вы можете запустить его без потоков, например FLASK_APP=server.py flask run.Как только у вас это получится, вы можете переключиться на производственный WSGI, такой как gunicorn.Вместо этого просто запустите его следующим образом.

gunicorn server:app

Как только вы сможете запускать с помощью gunicorn, вы можете настроить на использование нескольких потоков и даже процессов.Если ваша работа связана с IO, я рекомендую вместо этого использовать gevent.

?

...