【问题标题】:Flask auto-reload and long-running thread烧瓶自动重新加载和长时间运行的线程
【发布时间】:2012-03-29 04:40:50
【问题描述】:

我正在 Flask 应用程序中实现一个长时间运行的线程。在调试模式下,激活重新加载器后,重新加载时不会终止长时间运行的线程。

相反,因为创建和启动线程的代码是在重新加载后运行的,所以每个循环都会创建一个额外的线程。

除了禁用重新加载器之外,我还能如何防止这种情况发生?

在具有自动重新加载功能的 mod_wsgi 下运行时会发生同样的情况吗?

更新:长时间运行的线程实际上在重新加载时被 Werkzeug 杀死。有一个额外的副本,这是由于 Werkzeug 的重新加载器采用了一个额外的线程来运行初始化代码。

【问题讨论】:

    标签: python mod-wsgi wsgi flask werkzeug


    【解决方案1】:

    mod_wsgi 的重新加载描述在:

    http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

    对于长时间运行的请求,默认情况下,如果它没有在 5 秒内完成,则无论如何都会强制终止该进程。这是为了避免由于请求无法完成而导致进程锁定的问题。

    【讨论】:

    • 谢谢。正如我在您链接到的文档中看到的那样,在守护进程模式下,整个进程都会重新启动,因此我的线程将随之死亡。
    • 是的,抱歉,忘记说明 5 秒超时仅适用于守护程序模式。嵌入式模式重新加载再次与记录不同。
    • 至少在我的应用程序中,现有线程没有被杀死,即使在 5 秒后也没有。也许这些年来有些事情发生了变化。
    • 没有任何改变。更有可能您没有在 mod_wsgi 守护程序模式下运行。这是人们常犯的错误。他们设置了 WSGIDaemonProcess 但没有设置 WSGIProcessGroup 以实际委托 WSGI 应用程序在守护进程中运行。因此,我们使用了嵌入模式,并且其行为方式有所不同。
    猜你喜欢
    • 2019-02-23
    • 2017-12-18
    • 2020-12-14
    • 2018-12-25
    • 1970-01-01
    • 2013-04-07
    • 2017-11-04
    • 2014-11-22
    相关资源
    最近更新 更多