微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问 asyncio add_done_callback 回调中的上下文变量

如何解决访问 asyncio add_done_callback 回调中的上下文变量

在 Python 异步函数中,我正在创建 Contextvar、任务并为其附加回调:

bbb = contextvars.Contextvar('aaa')
bbb.set(3)
task = self.loop.create_task(self.someFunc())
task.add_done_callback(self.commonCallback)
bbb.set(4)

在回调中我首先启动调试器:

def commonCallback(self,result):
 pdb.set_trace()
 try:
  r = result.result()
  print(r)
 except:
  self.log.exception('commonCallback')

在调试器中:

-> try:
(Pdb) bbb.get()
*** NameError: name 'bbb' is not defined
(Pdb) ctx = contextvars.copy_context()
(Pdb) print(list(ctx.items()))
[(<Contextvar name='aaa' at 0xa8245df0>,3)]
(Pdb) 

Contextvar 在那里,但我无法访问它。所以,我错过了一些东西,但找不到什么?

解决方法

bbb 局部变量是在一个地方定义的,因此它不会在另一个地方自动访问,例如代码中其他地方定义的 commonCallback 函数。 documentation 声明“上下文变量应该在顶级模块级别创建”,因此您应该先尝试这样做。

,

您无需导入顶级模块即可从上下文中获取值。 contextvars.Context 有 __iter__ 方法。您可以使用 for 循环来获取值:

def get_ctx_var_value(ctx,var_name,default_value=None):
    for var in ctx:
        if var.name == var_name:
            return ctx[var]
    return default_value

ctx = contextvars.copy_context()
var_value = get_ctx_var_value(ctx,'aaa')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。