Python 如何将WSGI用于我的Flask应用程序?我的应用程序使用线程

Python 如何将WSGI用于我的Flask应用程序?我的应用程序使用线程,python,flask,uwsgi,gunicorn,wsgi,Python,Flask,Uwsgi,Gunicorn,Wsgi,我有一个python程序。它产生了新的线程,即API服务器。它在测试环境中工作。但是,我希望在生产环境中使用WSGI(例如gunicorn)。没有大的改变我怎么做 我想使用WSGI的原因有很多,但一个主要原因是我想设置超时,以便为非常慢的请求终止打开的连接。我面临一个性能问题。非常慢的请求最终会影响其他请求 *档案 ├── server.py └── api.py *server.py import time import api api_server = api.APIServer() a

我有一个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

真正的代码在这里。我从这个代码中找到了一些


维斯蒂奇的方法绝对正确。但是如果可能的话,我不想做太多的改变。

对于您来说,棘手的部分是确保您顺利运行其他线程。我建议分两步做

  • 更改周围的线程,以便在后台线程中启动其他内容
  • 然后切换到gunicorn,您可以使用
    post\u worker\u init
    server hook启动后台线程
  • 这里不需要你的线程。您可以立即切换到
    gunicorn
    。只需安装
    pip安装gunicorn
    ,然后将应用程序移到例如
    server.py
    。这是非常重要的

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def index():
      return 'hello'
    
    现在,您可以不使用诸如so
    FLASK\u APP=server.py FLASK run
    之类的线程来运行它。在这一点上,您可以切换到生产WSGI,如gunicorn。就这样启动它吧

    gunicorn server:app
    
    一旦可以使用gunicorn运行,就可以使用多个线程甚至进程。如果您的工作受IO限制,我建议改用
    gevent


    非常感谢你。当我添加“更新1”时,我不想分割文件,因为真正的代码有点大并且经过测试。但是我想把它分开再测试一次,因为你的建议好多了。啊,是的,这很重要。在实际代码中,您实际上需要线程。与尽可能少的改变不同,我建议以小步骤进行改变。例如,首先反转一些东西,使其他东西在线程中运行,web应用程序在文件中“裸体”,以便您可以使用gunicorn运行它。现在,您可以使用
    post\u worker\u init
    hook启动另一个线程