Utilisation de Gevent dans Flask: l'API n'est pas asynchrone

Aug 18 2020

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

1 AlexWeavers Sep 01 2020 at 14:30

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

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

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