如果我在异步网络服务器中有一个结构,例如
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:
块中并some_function_that_can_raise()
引发异常,它会泄漏内存吗?
(没有这种情况,.reset()
永远不会被调用)
try:
await some_function_that_can_raise()
finally:
local_ctx_var.reset()
.. 或者假设请求范围结束时该值将被销毁是否安全?
上游文档中的异步示例实际上根本不打扰.reset()
它!
在这种情况下,.reset()
这是多余的,因为它发生在上下文被清理之前。
为了添加更多上下文(ha),我最近正在学习 ContextVars,我假设是第二种情况。
local_ctx_var
是唯一引用 Token ( from.set()
) 的名称,并且当请求范围结束时名称被删除,本地值应该成为垃圾收集的候选者,防止潜在的泄漏并使.reset()
短期范围变得不必要(万岁)
..但我不确定,虽然有一些关于这个主题的非常有用的信息,但它稍微混淆了混合物
- 如果我不重置 Python 的 ContextVars 会发生什么?(暗示它会像人们期望的那样被 GC 处理)
- Python 中的上下文变量(显式使用
finally:
)