如果我不重置Python的ContextVars会发生什么?

8

这是 Python 中的内存泄漏吗?

import contextvars

contextvar = contextvars.ContextVar('example')

while True:
   string = 'hello world'
   token = contextvar.set(string)

ContextVar是一个栈,随着越来越多的推送而不断增长吗?

如果我从未调用contextvar.reset(令牌)怎么办?

还是所有内容都由引用计数处理?

2个回答

8
“token”对象包含恢复值作为其自身的普通属性(.old_value)。无论内部表示如何,只要您保留对令牌的一个引用,旧值就会存在。

现在,如果ContextVar对象在每次“设置”新值时都堆叠引用,则可能需要担心-似乎并非如此:旧值保存在令牌本身中(通过创建令牌列表,我可以随意使用其中任何一个来重置令牌创建时的值,无论顺序如何-因此,令牌所做的就是确保它只能与创建它的ContextVar一起使用)

(时间上:@mkrieger1答案中的实验先到这里,并为我提供了重要信息,以便进行自己的测试并断言令牌值保存在令牌内部,而不是在上下文中)

2

我让这个脚本运行了一段时间,内存消耗没有增加。

与这个脚本相比:

s = ''

while True:
    s += 'hello world'

所以看起来不是内存泄漏。


你认为token是指先前值的引用吗? - Rol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接