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