当前位置: 首页 > 面试题库 >

在单独的线程中启动Flask应用程序

林俭
2023-03-14
问题内容

我目前正在开发一个Python应用程序,希望在该应用程序上查看实时统计信息。我想使用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.run:app.run(debug=True, use_reloader=False)



 类似资料:
  • 问题内容: 我在处理pyGTK应用程序时遇到一些问题。我给线程一些时间来完成其任务,如果有问题,我还是继续继续,只是警告用户。但是,一旦我继续,该线程就会停止,直到调用gtk.main_quit为止。这让我感到困惑。 相关代码: .................................... 问题答案: 首先,不要继承,使用。 其次,很可能导致您明显的阻塞的原因是它采用了一个默认值为的参

  • 这是我的第一个问题。我一路寻找,尝试了很多,但没有得到我想做的。问题是:我有一个应用程序使用SoundPool播放声音,仅此而已。但是要加载的东西很多(>50),一个一个加载需要时间。看一看; @Override公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){View V

  • 我创建了以下示例。但我没有得到预期的结果。下面是我的代码: 1.应用程序.属性 下面是完整的堆栈跟踪:

  • 问题内容: 是否可以以平台无关的方式使用Java应用程序的名称(而不是其位置)在单独的进程中加载​​Java应用程序? 我知道你可以通过…执行程序 …这种方法的主要问题是,此类调用是特定于平台的。 理想情况下,我会将方法包装成像…这样简单的东西。 …并以形式传入应用程序类的完全限定名称。 问题答案: 两个提示: 为你提供了Java可执行文件的路径。 帮助你重构当前应用程序的类路径。 然后你就是(伪

  • 当我的应用程序启动时,将创建一个executor服务(在java.util.concurrent中使用Executors.NewFixedThreadPool(maxThreadNum))对象。当请求到来时,executor服务将创建线程来处理它们。 当应用程序启动时,它将在executorService池中创建200个线程。 只是想知道当应用程序启动时,这是一种正确的创建线程的方法吗?还是有更好

  • 问题内容: 我在应用程序中使用时遇到问题。 我正在应用程序的构造函数中创建。套接字的构造函数调用该方法以等待客户端连接。 问题在于该方法将冻结我的整个应用程序,直到客户端连接为止。因此,我想问一下是否有替代方法可以在单独的线程中创建整体,在我的主应用程序旁边调用的构造方法及其方法? 编辑: 感谢Olivier的建议,将.accept放入一个可运行的程序并创建一个线程池来处理客户端连接。 那就是我现