在Python中重新加载模块时管理具有副作用的全局对象

时间:2012-01-25 11:54:27

标签: python module side-effects

我正在寻找一种方法来正确管理使用某些操作系统资源(如文件或线程)的模块级全局变量。

问题是当重新加载模块时,必须正确处理我的资源(例如文件关闭或线程终止),然后才能创建新模块。

所以我需要一个更好的模式来管理这些单例对象。

2 个答案:

答案 0 :(得分:1)

我一直在阅读关于模块重新加载的文档,这非常有趣:

  

重新加载模块时,其字典(包含模块的字典)   保留全局变量)。名称的重新定义将覆盖   旧的定义,所以这通常不是问题。如果是新的   模块的版本没有定义旧的名称   版本,旧的定义仍然存在。此功能可用于   如果模块维护对象的全局表或缓存,则该模块具有优势    - 使用try语句,它可以测试表的存在并跳过   如果需要,可以进行初始化:

try:
    cache
except NameError:
    cache = {}

所以我可以检查对象是否已经存在,并在创建新对象之前对其进行处理。

答案 1 :(得分:0)

你需要monkeypatch或fork django挂钩到django dev server reloading feature并做正确的事来管理文件关闭等...

但是,因为您开发了django应用程序,如果您打算在将来使用适当的服务器来为您的应用程序提供服务,那么您应该考虑管理全局变量并考虑semaphores和{ {3}}

在走这条路线之前实施所有这些容易出错和脱发的代码。您应该考虑其他解决方案,例如all that jazz数据库(nosqlredismongodbneo4j ...)和后台流程管理员,例如hadoopcelery。如果所有这些都不影响您的用例并且您无法避免自己创建和管理文件以及全局变量,那么请考虑客户端是Web服务器线程的gearman模式,除非您想要弄乱client/server