web-dev-qa-db-fra.com

Multi-traitement en flacon Python

Cette question a probablement été posée et a plus d'une fois probablement répondu, mais je ne sais pas où la trouver ici.

Problème: j'ai un routeur pour le flacon de python, cela prend un certain temps pour traiter les données pour chaque appel. Je dois faire en sorte que chacun des appels sur les routes soit un fil en lui-même, de sorte qu'il n'ait pas à attendre que les demandes soient chargées.

13
Corbbin Goldsmith

Flask est fourni avec un serveur Web de développement intégré, mais vous ne devriez pas l'utiliser en production

Pour obtenir des fonctionnalités intéressantes, telles que des processus distincts pour chaque demande et chaque service de fichier statique, vous devez exécuter un service Web réel et un service WSGI devant votre application Flask.

Les documents Flask fournissent plusieurs exemples sur la manière de le configurer . Les combinaisons populaires Serveur Web/WSGI sont Apache/mod_wsgi et Nginx/Gunicorn, mais il existe de nombreuses autres options.

11
Brendan Abel

Un très bon moyen de configurer cela consiste à utiliser "uwsgi" comme serveur d'applications (et protocole) et Nginx comme proxy frontal. Ce sont des threads très rapides, évolutifs, à gérer, et il s’agit d’une des méthodes recommandées par Flask. Bien que la documentation du flacon fournisse la configuration de base, ce guide est un manuel que j’ai utilisé et qui donne une procédure beaucoup plus détaillée pour l’installation. Ils utilisent Ubuntu, mais avec des modifications mineures (aux commandes d’installation), cela fonctionnera sur la plupart des versions de Linux.

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-14-04

5
Neil P

Comme d'autres l'ont mentionné, il existe des outils spécialisés pour le faire ( céleri semble être le meilleur), mais si quelqu'un veut juste mettre rapidement quelque chose en place, voici mon approche qui utilise uniquement le module multiprocessing de Python:

from flask import Flask
from multiprocessing import Process
import time

app = Flask(__name__)

def detachedProcessFunction(wait_time):
    i=0
    while i<wait_time:
        i = i+1
        print "loop running %d" % i
        time.sleep(1)

@app.route('/start')
def start():
    global p
    p = Process(target=detachedProcessFunction, args=(15))
    p.start()
    return render_template('layout.html')

if __== '__main__':
    app.run(debug=True)

REMARQUE: cette méthode ne fonctionnera pas pour l'exécution de fonctions d'objet (par exemple, obj.objFunc()). Vous obtiendrez un EOFError: Ran out of input inside a class. Dans ce cas, vous devez créer l'objet dans une fonction non-objet/autonome et transmettre les arguments nécessaires à la création de l'objet. Pour plus d'informations, voir ici

1
DankMasterDan