在 asyncio add_done_callback 回调中访问 contextvars
Access to contextvars in asyncio add_done_callback 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')
在 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')