我有一个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的方式是绝对正确的。但如果可能的话,我不想改变很多。
答案 0 :(得分:1)
棘手的部分是确保顺利运行其他线程。我建议分两步完成
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运行,你可以configure使用多个线程,甚至是进程。如果您的工作受IO限制,我建议改为使用gevent
。