Utilisation de Gevent dans Flask: l'API n'est pas asynchrone
Auparavant, j'utilisais Waitress. J'utilise maintenant Gevent pour exécuter mon application Flask qui n'a qu'une seule API
from flask import Flask, request, jsonify
import documentUtil
from gevent.pywsgi import WSGIServer
app = Flask(__name__)
@app.route('/post-document-string', methods=['POST'])
def parse_data():
req_data = request.get_json(force=True)
text = req_data['text']
result = documentUtil.parse(text)
return jsonify(keywords = result)
if __name__=='__main__':
http_server = WSGIServer(('127.0.0.1', 8000), app)
http_server.serve_forever()
Cela fonctionne très bien. Mais l'API n'est pas asynchrone. Si depuis le front-end, je déclenche la même API deux fois en même temps, le deuxième appel attend que le premier donne la réponse en premier.
Quel est le problème ici? Comment puis-je le rendre asynchrone?
Réponses
Nous utilisons Gunicorn pour exécuter Flask dans plusieurs processus. Vous obtenez plus de jus de python de cette façon + redémarrages automatiques et autres. Exemple de fichier de configuration:
import multiprocessing
bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config
Puis cours avec quelque chose comme
gunicorn --config /path/to/file application.app
Pas sûr, cependant je pense que l'ajout de paramètres de thread dans l'objet serveur peut résoudre le problème.
http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)
la source: https://f.gallai.re/wsgiserver
"""index.py"""
from flask import Flask
from flask import jsonify
app = Flask(__name__)
@app.route('/')
def index():
"""Main page"""
doc = {
'site': 'stackoverflow',
'page_id': 6347182,
'title': 'Using Gevent in flask'
}
return jsonify(doc)
# To start application
gunicorn -k gevent --bind 0.0.0.0 index:app
k : worker_class
--bind : bind address
# See https://docs.gunicorn.org/en/latest/settings.html