我有一个初始化成本高的共享资源,因此我想在整个系统中访问它(它基本上用于某些仪器,因此必须重量轻)。所以我创建了一个管理设置和访问权限的模块。它执行资源的惰性初始化并将其存储在模块全局变量中。然后,我在整个系统中使用此模块的功能来操作资源。
- 现在我想知道是否(或多久)我必须重新初始化资源?
- 我知道CPython中的对象是零引用计数(或者更好)的垃圾收集,但是存储在计为引用的模块中,即使模块目前没有被执行?
代码示例:这里我们有模块,其中_connect()很慢。我想在我的系统中使用report_safely()并最终尽可能少地调用_connect()。
__metrics = None
def _connect():
global __metrics
client = SomeSlowToSetUpClient()
__metrics = SomeMetrics(client)
client.connect()
def report_safely():
if not __metrics:
_connect()
__metrics.execute_lightweight_code()
答案 0 :(得分:8)
不再引用的对象确实是垃圾回收的(当引用计数降为0时会自动删除它们。)
然而,全局模块永远不会将它的引用计数降为0;一旦导入了一个模块对象(它的命名空间),就会生成sys.modules
映射。命名空间本身就是指你的对象。
换句话说,你的对象永远存在,直到你从模块命名空间中删除它,删除模块命名空间本身(del sys.modules['yourmodule']
)或你的python脚本退出。
答案 1 :(得分:0)
如果包含全局的模块在从执行开始到结束的范围内,那么全局变量将是。可能更干净,使用类实例。