web-dev-qa-db-fra.com

Comment exécuter Flask avec Gunicorn en mode multithread

J'ai une application web écrite en Flask. Comme suggéré par tout le monde, je ne peux pas utiliser Flask en production. J'ai donc pensé à Gunicorn with Flask.

Dans Flask je charge certains modèles de Machine Learning. Ceux-ci sont collectivement de 8 Go. La concurrence de mon application Web peut aller jusqu'à 1000 requêtes. Et le RAM de la machine est de 15 Go.
Alors, quelle est la meilleure façon d'exécuter cette application?

21
neel

Vous pouvez démarrer votre application avec plusieurs travailleurs ou des travailleurs asynchrones avec Gunicorn.

Flask server.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

Gunicorn avec gevent async worker

gunicorn server:app -k gevent --worker-connections 1000

Gunicorn 1 travailleur 12 fils:

gunicorn server:app -w 1 --threads 12

Gunicorn avec 4 ouvriers (multiprocessing):

gunicorn server:app -w 4

Plus d'informations sur Flask simultanéité dans cet article: Combien de demandes simultanées un seul processus Flask reçoit-il? ).

34
molivier

La meilleure chose à faire est d'utiliser le mode pré-fork ( preload_app = True ). Cela initialisera votre code dans un processus "maître", puis se contentera de bifurquer les processus de travail pour gérer les demandes. Si vous utilisez Linux et que votre modèle est en lecture seule, le système d'exploitation est suffisamment intelligent pour réutiliser la mémoire physique parmi tous les processus.

3
slushi