Flask在调试模式下重启时挂钩

时间:2013-07-09 15:40:52

标签: python flask werkzeug

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

从文档或源代码中可以清楚地了解它。

看起来重启正在Werkzeug/serving.py:523中的run_with_reloader函数周围进行。似乎没有任何方法可以通过公开的API挂钩。

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

1 个答案:

答案 0 :(得分:1)

我认为我已经找到了解决此问题的方法。 问题来自第一次werkzeug重新加载,它说将使用哪个文件监视程序,并记录如下内容:

let attributedText = NSMutableAttributedString(string: " ")

重新加载是通过* Restarting with inotify reloader" 完成的,因此我们同时有 2个不同的Python解释器在运行

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

这是在werkzeug上完成的方式:

subprocess.call

我的解决方案是,当我使用werkzeug时(在我的情况下app.debug为true时),仅对重新加载的子进程执行后台线程初始化。 要知道您在子流程中,werkzeug提供了 sig = getattr(signal, "SIGKILL", signal.SIGTERM) # reloader active if is_running_from_reloader(): os.kill(os.getpid(), sig) 函数

进入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