在Python异步中是否可以提供一个带有if调用者上下文的异步生成器?

问题描述 投票:0回答:1

我有一个异步任务“链”,即任务

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
对象做类似的事情吗?

python asynchronous async-await python-asyncio
1个回答
0
投票

“有没有类似‘任务堆栈’的东西,我可以在其中看到哪个任务正在等待另一个任务产生或返回什么?”

是的。它被称为“contextvars” - https://docs.python.org/3/library/contextvars.html

[WIP:示例]

© www.soinside.com 2019 - 2024. All rights reserved.