Python:模块全局变量的生命周期

时间:2013-06-25 15:13:16

标签: python global lifecycle cpython

我有一个初始化成本高的共享资源,因此我想在整个系统中访问它(它基本上用于某些仪器,因此必须重量轻)。所以我创建了一个管理设置和访问权限的模块。它执行资源的惰性初始化并将其存储在模块全局变量中。然后,我在整个系统中使用此模块的功能来操作资源。
- 现在我想知道是否(或多久)我必须重新初始化资源?
- 我知道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()

2 个答案:

答案 0 :(得分:8)

不再引用的对象确实是垃圾回收的(当引用计数降为0时会自动删除它们。)

然而,

全局模块永远不会将它的引用计数降为0;一旦导入了一个模块对象(它的命名空间),就会生成sys.modules映射。命名空间本身就是指你的对象。

换句话说,你的对象永远存在,直到你从模块命名空间中删除它,删除模块命名空间本身(del sys.modules['yourmodule'])或你的python脚本退出。

答案 1 :(得分:0)

如果包含全局的模块在从执行开始到结束的范围内,那么全局变量将是。可能更干净,使用类实例。