Démarrer l'application d'une fiole dans un filetage séparé
je suis en train de développer une application Python sur laquelle je veux voir des statistiques en temps réel. Je voulais utiliser Flask
afin de le rendre facile à utiliser et à comprendre.
Le problème est que mon Flacon serveur devrait commencer au tout début de mon application en Python et s'arrêter à la fin. Il devrait ressembler à ceci:
def main():
""" My main application """
from watcher.flask import app
# watcher.flask define an app as in the Quickstart flask documentation.
# See: http://flask.pocoo.org/docs/0.10/quickstart/#quickstart
app.run() # Starting the flask application
do_my_stuff()
app.stop() # Undefined, for the idea
parce que j'ai besoin de mon contexte d'application (pour les statistiques), Je ne peux pas utiliser un multiprocessing.Process
. Alors j'ai essayé d'utiliser un threading.Thread
, mais il on dirait que Werkzeug n'aime pas:
* Running on http://0.0.0.0:10079/
Exception in thread Flask Server:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File ".../develop-eggs/watcher.flask/src/watcher/flask/__init__.py", line 14, in _run
app.run(host=HOSTNAME, port=PORT, debug=DEBUG)
File ".../eggs/Flask-0.10.1-py2.7.egg/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 609, in run_simple
run_with_reloader(inner, extra_files, reloader_interval)
File ".../eggs/Werkzeug-0.7-py2.7.egg/werkzeug/serving.py", line 524, in run_with_reloader
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
ValueError: signal only works in main thread
Comment puis-je faire cela sans utiliser Flask dans le filetage principal?
4 réponses
Vous êtes en cours d'exécution Flask
en mode debug, qui permet le reloader (recharge le serveur flasque lorsque votre code change).
Fiole pouvez exécuter très bien dans un thread séparé, mais le reloader s'attend à exécuter dans le thread principal.
Pour résoudre votre problème, vous devez désactiver le débogage (app.debug = False
), ou désactiver le reloader (