最近我想在运行其他任务时在后台运行一些异步任务,但我认为代码不够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?
这样的事情已经存在吗?
不是现在,但这是一个非常有用的想法。这个概念的更一般版本将以TaskGroup
和Curio的现有技术为灵感的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中的异常,这是异步代码中常见的错误源。