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?

26
demandé sur Phillip 2015-07-07 12:30:33

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 (