如果我不重置 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 的回答中的实验首先在这里,并为我提供了重要信息,以便能够进行我自己的测试并断言令牌值保留在令牌中,而不是在上下文中)
这是 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 的回答中的实验首先在这里,并为我提供了重要信息,以便能够进行我自己的测试并断言令牌值保留在令牌中,而不是在上下文中)