Utilizzo di Gevent in flask: l'API non è asincrona
Prima stavo usando la cameriera. Ora sto usando Gevent per eseguire la mia app Flask che ha una sola 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()
Funziona bene. Ma l'API non è asincrona. Se dal front-end, avvio la stessa API due volte contemporaneamente, la seconda chiamata attende che la prima dia risposta per prima.
Cosa c'è che non va qui? Come posso renderlo asincrono?
Risposte
Usiamo Gunicorn per eseguire Flask in più processi. In questo modo ottieni più succo da Python + riavvii automatici e cose del genere. File di configurazione di esempio:
import multiprocessing
bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config
Quindi corri con qualcosa di simile
gunicorn --config /path/to/file application.app
Non sono sicuro, tuttavia penso che l'aggiunta del parametro thread nell'oggetto server possa risolvere il problema.
http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)
fonte: 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