我目前正在开发一个Python应用程序,希望在该应用程序上查看实时统计信息。我想使用Flask它以使其易于使用和理解。
Flask
问题是我的Flask服务器应该在我的Python应用程序的最开始处启动,而在最末尾停止。它看起来应该像这样:
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
因为我需要我的应用程序上下文(用于统计),所以不能使用multiprocessing.Process。然后,我尝试使用threading.Thread,但是Werkzeug似乎不喜欢它:
* 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
不在主线程中运行Flask怎么办?
你正在Flask调试模式下运行,这将启用重新加载程序(在代码更改时重新加载Flask服务器)。
Flask可以在单独的线程中正常运行,但是重新加载程序希望在主线程中运行。
要解决你的问题,你应该禁用debug(app.debug = False),或禁用reloader(app.use_reloader=False)。
app.debug = False
app.use_reloader=False
这些也可以作为参数传递给app.run:app.run(debug=True, use_reloader=False)。
app.run:app.run(debug=True, use_reloader=False)