gpt4 book ai didi

python - 如果在异常后不重置,ContextVar 会在异步逻辑中泄漏内存吗?

转载 作者:行者123 更新时间:2023-12-05 03:42:57 32 4
gpt4 key购买 nike

如果我在异步网络服务器中有一个结构,例如

import contextvars
...
my_context_var = contextvars.ContextVar("var")

@app.route("/foo") # decorator from webserver
async def some_web_endpoint():
local_ctx_var = my_context_var.set(params.get("bar")) # app sets params
await some_function_that_can_raise()
local_ctx_var.reset()

如果我不将 ContextVar 包装在 finally: block 中并且 some_function_that_can_raise() 引发异常,它会泄漏内存吗?< br/>(如果没有这种情况,将永远不会调用 .reset())

    try:
await some_function_that_can_raise()
finally:
local_ctx_var.reset()

.. 还是假设请求范围结束时该值将被销毁是安全的?
The async example in the upstream docs doesn't actually bother .reset()-ing it at all !
在这种情况下,.reset() 是多余的,因为它恰好发生在清理上下文之前。


为了添加更多上下文 (ha),我最近正在学习 ContextVars,我假设是第二种情况。

local_ctx_var 是唯一引用 token 的名称 ( from .set() ),当请求范围结束时删除名称,本地值应该成为垃圾收集的候选者,防止潜在的泄漏并使 .reset() 对于短暂的范围来说是不必要的(万岁)

..但我不是绝对确定,虽然有一些关于这个主题的非常有用的信息,但它稍微混淆了混合物

最佳答案

是 - 在这种情况下,context_var 的先前值保留在 token 对象中。有这个rather similar question ,其中一个答案运行一个简单的基准测试来断言多次调用 context_var.set() 并丢弃返回值不会消耗内存,例如,与创建一个新字符串并保持对它的引用。

鉴于基准,我做了一些进一步的实验并得出结论没有泄漏 - 事实上,在上面的代码中,调用 reset 确实是多余的 - 如果你必须这样做,它很有用出于某种原因在循环构造中恢复以前的值。

新变量被设置,在上次保存的上下文的顶部,在当前版本的上下文中设置的值被简单地丢弃:唯一对它的引用是剩下的在 token 中,如果有的话。换句话说:以“类似堆栈”的方式保留先前值的是仅调用 contextvars.runcontextvars.copy_context,而不是 Contextvar.set.

关于python - 如果在异常后不重置,ContextVar 会在异步逻辑中泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67062025/

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