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

Zak*_*kum 4 python lifecycle global 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()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

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

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

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