2017-05-11 2 views
1

Je lance mon application Flask directement via l'interpréteur.Comment démarrer les threads d'arrière-plan lors du lancement d'une application Flask via gunicorn?

if __name__ == '__main__': 
    t = Thread(target=run_schedule) 
    t.start() 
    context = ('cert.pem', 'key.pem') 
    app.run(host='0.0.0.0',port=8080,debug=False,ssl_context=context) 

La fonction run_schedule boucles pour toujours, débouchage de temps en temps pour accomplir une tâche.

Apparemment, je suis supposé utiliser un serveur wsgi comme gunicorn quand je ne débogue plus, mais il n'appelle pas le module par main(), donc le thread ne démarre pas. Les mettre à l'extérieur de ce bloc ne fonctionnera pas parce que le thread serait alors lancé si un autre code importait le module!

@before_first_request est presque ce dont j'ai besoin, mais il me faut d'abord piquer le serveur avec une demande. Pas idéal.

Quelle est la méthode recommandée pour le faire? (Ou les threads d'arrière-plan vont-ils à l'encontre de la philosophie wsgi?)

+1

Vous ne devez pas générer des threads d'arrière-plan dans votre application serveur. Par exemple, un serveur WSGI [peut générer plusieurs applications serveur] (http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#adding-concurrency-and-monitoring) et vous avez plusieurs threads d'arrière-plan. Au lieu de cela, regardez dans [cronjobs] (https://en.wikipedia.org/wiki/Cron) ou [files d'attente de travail comme céleri] (http://www.celeryproject.org/). –

+1

Gotcha, merci. Vous voulez le déplacer à une réponse pour que je puisse l'accepter? –

+1

Fait, merci –

Répondre