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?
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? ).
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.