如果我不重置 Python 的 ContextVars 会怎样?

What happens if I don't reset Python's ContextVars?

这是 Python 中的内存泄漏吗?

import contextvars

contextvar = contextvars.ContextVar('example')

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

contextvar 是否是一个堆栈,它会随着您向其推送的次数越多而不断增长?

如果我不打电话给 contextvar.reset(token) 怎么办?

或者所有的事情都是用引用计数来处理的?

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

与此脚本对比:

s = ''

while True:
    s += 'hello world'

看来不是内存泄漏

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

现在,如果 ContextVar 对象会在“设置”新值时堆叠对其值的引用,您可能会担心一些事情 - 情况似乎并非如此:旧值保留在令牌本身中(通过创建一个令牌列表,我可以随意使用其中的一个来重置令牌创建时的值,而不管顺序如何 - 因此,令牌所做的只是确保它只能与创建的 ContextVar 一起使用它)

(及时:@mkrieger1 的回答中的实验首先在这里,并为我提供了重要信息,以便能够进行我自己的测试并断言令牌值保留在令牌中,而不是在上下文中)