Usando Gevent en matraz: API no es asincrónica

Aug 18 2020

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

1 AlexWeavers Sep 01 2020 at 14:30

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
1 pritesh Sep 07 2020 at 06:43

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

1 EM28 Sep 07 2020 at 23:17
"""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