Usando Gevent en matraz: API no es asincrónica
Antes estaba usando Waitress. Ahora estoy usando Gevent para ejecutar mi aplicación Flask que solo tiene una 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()
Esto funciona bien. Pero la API no es asincrónica. Si desde el front-end, disparo la misma API dos veces al mismo tiempo, la segunda llamada espera a que la primera responda primero.
Que esta mal aquí ? ¿Cómo puedo hacerlo asincrónico?
Respuestas
Usamos Gunicorn para ejecutar Flask en múltiples procesos. Obtienes más jugo de Python de esa manera + reinicios automáticos y esas cosas. Archivo de configuración de muestra:
import multiprocessing
bind = "0.0.0.0:80"
workers = (multiprocessing.cpu_count() * 2) + 1
# ... additional config
Entonces corre con algo como
gunicorn --config /path/to/file application.app
No estoy seguro, sin embargo, creo que agregar un parámetro de hilo en el objeto del servidor puede resolver el problema.
http_server = WSGIServer(('127.0.0.1', 8000), app, numthreads=50)
fuente: 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