我想我已经找到了解决这个问题的方法。问题来自第一次 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)