我有一个异步任务“链”,即任务
gather
/await
其他具有任意深度的任务。
现在我想要一个“上层”任务(即 await
的“下层”任务,然后可能是 await
下层任务)为“下层”任务之一提供一些上下文信息,例如创建较低任务时可能尚不存在的一些日志记录对象。
async def compute(args):
#
# Here we don't know (yet) when or by whom this function get's awaited
#
logger = global_loggers[find_context(asyncio.current_task())]
.. do stuff ..
logger.write("something that goes somewhere")
yield stuff
logger.write("something that goes somewhere")
yield stuff
logger.write("something that goes somewhere")
..
async def some_weired_scheduler():
#
# this function doesn't make sense, it's just here to make the `await` queue deeper
..
tasks_for_later.append(asyncio.gather(compute(<args1>), compute(<args2>)))
..
async def logging_executor():
#
# here we invoke the compute-generators and we want to 'inject' some runtime
# environment, in this case it's just a logger
#
logger = MyLogger()
global_loggers[find_context(asyncio.current_task())] = logger
for t in tasks_for_later:
await t
是否有一些内置的方法可以完成这样的事情?是否有类似“任务堆栈”的东西,我可以在其中查看哪个任务
await
是什么另一个 yield
或 return
?
Quart
不是用它的全局 request
对象做类似的事情吗?
“有没有类似‘任务堆栈’的东西,我可以在其中看到哪个任务正在等待另一个任务产生或返回什么?”
是的。它被称为“contextvars” - https://docs.python.org/3/library/contextvars.html
[WIP:示例]