6

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

2 回答 2

10

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

然而,一个全局模块永远不会让它的引用计数下降到 0;一旦导入了一个模块对象(它的命名空间),它就存在于sys.modules映射中。命名空间本身是指您的对象。

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

于 2013-06-25T15:19:16.657 回答
0

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

于 2013-06-25T15:16:32.847 回答