是否有Pythonic方法在后台运行异步任务类似于使用上下文管理器?

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

最近我想在运行其他任务时在后台运行一些异步任务,但我认为代码不够Pythonic:

task = asyncio.create_task(long_task())
await short_task()
await task

所以我把它变成了Pythonic:

@asynccontextmanager
async def run_in_background(coro):
    task = asyncio.create_task(coro)
    yield task
    await task


async def main():
    async with run_in_background(long_task()):
        await short_task()

这样的事情已经存在吗?如果不是,这被认为比现有方式更像Pythonic或Pythonic?

python async-await python-asyncio contextmanager
1个回答
2
投票

这样的事情已经存在吗?

不是现在,但这是一个非常有用的想法。这个概念的更一般版本将以TaskGroupCurio的现有技术为灵感的Trio类的形式添加到Python 3.8中。

我建议加强使用finally的实现,保证即使在例外的情况下也会等待后台任务;例如:

@asynccontextmanager
async def run_in_background(coro):
    task = asyncio.create_task(coro)
    try:
        yield task
    finally:
        await task

如果不是,这被认为比现有方式更像Pythonic或Pythonic?

问题的这一部分显然是基于意见的,但我会说上下文管理器更像是Pythonic,因为它确保后台任务在块离开时完成并等待。它还确保后台任务do not pass silently中的异常,这是异步代码中常见的错误源。

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