gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:12:15 26 4
gpt4 key购买 nike

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

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

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

关于Python:模块全局变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com