4

在调试模式下使用 Flask/Werkzeug 时,我在线程(使用watchdog)中打开了一些我想关闭的文件,否则我最终会开始获取OSError: too many files. 我想在 Flask/Werkzeug 在调试模式下关闭之前运行一个钩子(顺便说一句,observer.stop()来自observer.join()Watchdog docs)。

从文档或源代码中不清楚在哪里可以做到这一点。

看起来重新启动是围绕run_with_reloader. Werkzeug/serving.py:523似乎没有任何方法可以通过公开的 API 来连接这里。

在进程重新启动之前调用一些代码来获取线程的最佳方法是什么?

4

1 回答 1

1

我想我已经找到了解决这个问题的方法。问题来自第一次 werkzeug 重新加载,说明它将使用哪个文件观察程序,记录如下内容:

* Restarting with inotify reloader"

重新加载是用 a 完成的subprocess.call,所以我们有2 个不同的 Python 解释器同时运行!

在其他重新加载(文件更改)时,有一个很好的优势,子进程在启动一个新进程之前被杀死,这非常残酷但可以完成工作:

在 werkzeug 上是如何完成的:

        sig = getattr(signal, "SIGKILL", signal.SIGTERM)
        # reloader active
        if is_running_from_reloader():
            os.kill(os.getpid(), sig)

我的解决方案是,当我使用 werkzeug 时(在我的情况下 app.debug 为真)并且只在重新加载的子进程上执行我的后台线程初始化。要知道您在子流程中 werkzeug 提供的is_running_from_reloader功能

进入app/__init__.py

if not app.debug or app.debug and werkzeug.serving.is_running_from_reloader():
    # do what you want to do at start up

在其他地方,对我来说,进入课堂,在退出时进行清洁(当进程被杀死时)

class MyClass:
    @classmethod
    def cleanOnExit(cls):
        # do here your cleaning
import atexit ; atexit.register(MyClass.cleanOnExit)
于 2020-08-19T00:50:25.413 回答