threads thread parallel data python multithreading flask

data - python threads in parallel



Inicie una aplicaciĆ³n de matraz en un hilo separado (3)

De la documentación de werkzeug :

Apagando el servidor

Nuevo en la versión 0.7.

Comenzando con Werkzeug 0.7, el servidor de desarrollo proporciona una manera de cerrar el servidor después de una solicitud. Actualmente, esto solo funciona con Python 2.6 y versiones posteriores y solo funcionará con el servidor de desarrollo. Para iniciar el apagado, debe llamar a una función llamada ''werkzeug.server.shutdown'' en el entorno de WSGI:

def shutdown_server(environ): if not ''werkzeug.server.shutdown'' in environ: raise RuntimeError(''Not running the development server'') environ[''werkzeug.server.shutdown'']()

Actualmente estoy desarrollando una aplicación de Python en la que quiero ver estadísticas en tiempo real. Quería usar Flask para que sea fácil de usar y comprender.

El problema es que mi servidor Flask debe comenzar desde el principio de mi aplicación Python y detenerse al final. Debe tener un aspecto como este:

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

Como necesito el contexto de mi aplicación (para las estadísticas), no puedo usar un multiprocessing.Process . Luego intenté usar un threading.Thread . threading.Thread , pero parece que a Werkzeug no le gusta:

* 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

¿Cómo puedo hacer eso sin ejecutar Flask en el hilo principal?


Está ejecutando Flask en modo de depuración, lo que habilita el recargador (vuelve a cargar el servidor Flask cuando cambia su código).

Flask puede funcionar bien en un hilo separado, pero el recargador espera que se ejecute en el hilo principal.

Para resolver su problema, debe deshabilitar la depuración ( app.debug = False ) o deshabilitar el recargador ( app.use_reloader=False ).

Esos también se pueden pasar como argumentos a app.run : app.run(debug=True, use_reloader=False) .


Si está buscando acceder al terminal ipython en el matraz, ejecute su aplicación en un hilo separado, intente con este ejemplo:

from flask import Flask import thread data = ''foo'' app = Flask(__name__) @app.route("/") def main(): return data def flaskThread(): app.run() if __name__ == "__main__": thread.start_new_thread(flaskThread,())

ejecuta este archivo en ipython