在Django/mod_wsgi中安全进行一次性初始化的方法是什么?
我正在开发一个Django应用,这个应用设计成可以多线程,但只在一个进程中运行,使用mod_wsgi。每天开始的时候,我需要做一些可能比较耗时的初始化工作,比如从数据库加载数据到一个快速查找的字典里。我希望这个初始化过程在处理任何请求之前只运行一次,然后再启动一个后台线程,定期更新加载的数据。
我试过把初始化代码直接放在一个模块里,但发现有时候(如果在服务器启动时给它施加负载),初始化代码会被执行多次,这样就会搞砸一切。
有没有好的地方可以在Django或WSGI中插入代码,让这些初始化代码在任何请求被处理之前只执行一次?或者,有人知道在什么情况下模块的初始化代码会被执行多次(特别是在Django/WSGI环境下),或者有没有好的方法可以在某个地方存一个“我已经初始化过了”的标志?
3 个回答
0
我有一些初始化的代码是在Settings.py文件中调用的。这个Settings.py文件只会被执行一次,并且是在处理任何请求之前就执行了。
想了解如何拆分Settings.py文件,可以查看这个链接:http://code.djangoproject.com/wiki/SplitSettings。
0
也许一个老旧的锁文件可以解决这个问题。虽然这不是个特别优雅的办法,但在多线程环境中,它能帮你省去很多麻烦。
2
我把初始化的代码放在一个中间件里,这个中间件会在处理第一个请求时被调用。
初始化完成后,你可以抛出一个叫做 MiddlewareNotinuse 的异常,这样 Django 就不会再执行这个中间件了。
要记住,由于 Apache 和 HTTP 的工作方式,在第一个请求到达之前,任何代码都不会被执行。