Utilizzo di Gevent in flask: l'API non è asincrona

Aug 18 2020

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

1 AlexWeavers Sep 01 2020 at 14:30

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

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

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