是否有类似于使用contextmanager的Python方式在后台运行异步任务?
最近,我想在后台运行一些异步任务,同时运行其他任务,但我认为代码不够Pythonic:是否有类似于使用contextmanager的Python方式在后台运行异步任务?,python,async-await,python-asyncio,contextmanager,Python,Async Await,Python Asyncio,Contextmanager,最近,我想在后台运行一些异步任务,同时运行其他任务,但我认为代码不够Pythonic: task = asyncio.create_task(long_task()) await short_task() await task 所以我把它做得更像蟒蛇了: @asynccontextmanager async def run_in_background(coro): task = asyncio.create_task(coro) yield task await tas
task = asyncio.create_task(long_task())
await short_task()
await task
所以我把它做得更像蟒蛇了:
@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
这样的事情已经存在了吗
目前没有,但这是一个非常有用的想法。Python3.8将添加一个更通用的概念版本,这是一个未来的Python版本,其形式是受和中现有技术启发的类
我建议加强实现,最终使用,
,保证即使出现异常情况,也会等待后台任务;例如:
@asynccontextmanager
async def run_in_background(coro):
task = asyncio.create_task(coro)
try:
yield task
finally:
await task
如果不是的话,这是被认为比现有的方式更具Pythonic还是更少Pythonic
问题的这一部分显然是基于观点的,但我要说的是,上下文管理器更像python,因为它确保后台任务在块离开时完成并等待。它还可以确保后台任务中的异常,这是异步IO代码中常见的错误源。提供了一种更好的方法来处理托儿所对象:
async with trio.open_nursery() as nursery:
nursery.start_soon(long_task()) # Task will run in background
await short_task()
# Wait for background tasks to finish
拿一些短而有效的东西,然后转换成更大、更复杂的东西,这绝对不是一种蟒蛇式的行为。@Keith,它是如何变得更大、更复杂的呢?2行对3。@Keith这与使用
打开(“文件”)
vs文件相同。打开文件。关闭@Keith是的,但这就是实现,我写了一次,然后可以在任何地方使用它。如果有这样的现有方法,我就不需要编写新函数。你似乎没有抓住我问题的重点。这只是一个一般性的观察。这个问题实际上是模糊的,因为“Pythonic”也有点主观,并且您实际上并没有在异步框架中“在后台”运行任务。这只是事件循环的一部分,可能会阻止它。谢谢!等不及python 3.8了!