我正在寻找一种方法来正确管理使用某些操作系统资源(如文件或线程)的模块级全局变量。
问题是当重新加载模块时,我的资源必须在创建新的之前正确处理(例如文件关闭或线程终止)。
所以我需要一个更好的模式来管理那些单例对象。
我正在寻找一种方法来正确管理使用某些操作系统资源(如文件或线程)的模块级全局变量。
问题是当重新加载模块时,我的资源必须在创建新的之前正确处理(例如文件关闭或线程终止)。
所以我需要一个更好的模式来管理那些单例对象。
我一直在阅读有关模块重新加载的文档,这很有趣:
重新加载模块时,会保留其字典(包含模块的全局变量)。重新定义名称将覆盖旧定义,因此这通常不是问题。如果模块的新版本没有定义旧版本定义的名称,则旧定义仍然存在。如果模块维护一个全局表或对象缓存,则此功能可用于该模块的优势 - 使用 try 语句可以测试表的存在并在需要时跳过其初始化:
try:
cache
except NameError:
cache = {}
所以我可以检查对象是否已经存在,并在创建新对象之前处理它们。
您需要monkeypatch 或fork django 以挂钩django dev 服务器重新加载功能并做适当的事情来管理文件关闭等......
但是 ,由于您开发了一个 django 应用程序,如果您打算在将来使用适当的服务器来为您的应用程序提供服务,您应该考虑管理您的全局变量并考虑信号量和所有那些爵士乐。
但在走这条路并实现所有这些容易出错和脱发的困难代码之前。您应该考虑其他解决方案,如nosql数据库(redis、mongodb、neo4j、hadoop ...)和celery和gearman等后台进程管理器。如果所有这些都不适合您的用例,并且您无法避免自己创建和管理文件和全局变量,那么请考虑客户端是网络服务器线程的客户端/服务器模式,除非您想弄乱NFS。