4

这是 Python 中的内存泄漏吗?

import contextvars

contextvar = contextvars.ContextVar('example')

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

contextvar 是一个堆栈,你推的越多,它就会不断增长?

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

还是所有事情都通过引用计数来处理?

4

2 回答 2

4

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

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

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

于 2021-03-31T21:58:03.877 回答
1

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

与此脚本相反:

s = ''

while True:
    s += 'hello world'

所以它似乎不是内存泄漏。

于 2021-03-29T15:15:19.113 回答