我有一个 python 程序。它产生新线程,即 API 服务器。它适用于测试环境。但是我想在生产环境中使用 WSGI(例如 gunicorn)。如果不进行重大更改,我该怎么做?
我想使用 WSGI 的原因有很多,但一个重要的原因是我想设置超时,以便为非常慢的请求终止打开的连接。我面临性能问题。非常慢的请求最终会影响另一个请求。
*文件
├── server.py
└── api.py
*服务器.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的方法绝对正确。但如果可能的话,我不想改变太多。
最佳答案
对您来说棘手的部分是确保您顺利运行其他线程。我建议分两步进行
- 更改线程,以便其他内容在后台线程中启动。
- 然后切换到gunicorn,你可以使用
post_worker_init
server hook启动后台线程。
这里真的不需要你的线程。您可以立即切换到 gunicorn
。只需安装 pip install gunicorn
并将应用移出到例如服务器.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 运行,就可以 configure它使用多个线程,甚至进程。如果您的工作受 IO 限制,我建议改用 gevent
。
🦄
关于python - 我如何为我的 Flask 应用程序使用 WSGI?我的应用程序使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50402816/