在调试模式下使用Flask / Werkzeug时,我在线程中打开了许多文件(watchdog),我想关闭它,否则我最终会开始获得OSError: too many files
。我希望在Flask / Werkzeug在调试模式下关闭之前运行一个钩子(顺便提一句,来自Watchdog docs的observer.stop()
和observer.join()
)。
从文档或源代码中可以清楚地了解它。
看起来重启正在Werkzeug/serving.py:523
中的run_with_reloader
函数周围进行。似乎没有任何方法可以通过公开的API挂钩。
在重新启动进程之前调用某些代码来获取线程的最佳方法是什么?
答案 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